C++通过TCP向服务器请求时间

在linux下用C++通过TCP从客户端向服务器发送请求然后服务器给客户端返回时间求解linux的服务器跟客户端麻烦说一下服务器跟客户端怎么做。。全面一点的教程谢谢!... 在linux下 用C++通过TCP从客户端向服务器发送请求 然后服务器给客户端返回时间
求解 linux的服务器跟客户端
麻烦说一下 服务器跟客户端怎么做。。全面一点的教程 谢谢!
展开
 我来答
约定20125
推荐于2017-08-24 · TA获得超过1.5万个赞
知道大有可为答主
回答量:1.1万
采纳率:96%
帮助的人:2912万
展开全部
客户端向服务器端发送请求,服务器收到请求做相应的处理,将处理结果传回客户端。下面采用TCP协议实现服务器和客户端之间的连接。
1. 客户端
约定双方的传输协议(UDP或者TCP),根据传输协议创建socket;
服务器的IP地址和端口号;
连接服务器;
获取服务器传递回来的数据。

[cpp]
<SPAN style="FONT-SIZE: 18px"><STRONG>#include<string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include <sys/errno.h>
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
const int MAXLINE=1024;
int main(int argc,char** argv)
{
int sockfd,n;
char recvline[MAXLINE+1];
struct sockaddr_in servaddr;
if(argc!=2)
{
cout<<"usage: a.out<IPaddress"<<endl;
exit(0);
}
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
cout<<"socket error"<<endl;
exit(0);
}
memset(&servaddr,0, sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8080);//将无符号短整型数值转换为网络字节序,即将数值的高位字节存放到内存中的低位字节0X1234变为0X3412
if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0)//将ip地址在“点分十进制”和整数之间转换
{
cout<<"inet_ptons error"<<endl;
exit(0);
}
if(connect(sockfd,(sockaddr*)&servaddr,sizeof(servaddr))<0)
{
cout<<"connect error"<<endl;
exit(0);
}
while((n=read(sockfd,recvline,MAXLINE))>0)
{
recvline[n]=0;
if(fputs(recvline,stdout)==EOF)
{
cout<<"fputs error"<<endl;
exit(0);
}
}
if(n<0)
{
cout<<"read error"<<endl;
exit(0);
}
exit(0);
} </STRONG></SPAN>
#include<string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include <sys/errno.h>
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
const int MAXLINE=1024;
int main(int argc,char** argv)
{
int sockfd,n;
char recvline[MAXLINE+1];
struct sockaddr_in servaddr;
if(argc!=2)
{
cout<<"usage: a.out<IPaddress"<<endl;
exit(0);
}
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
cout<<"socket error"<<endl;
exit(0);
}
memset(&servaddr,0, sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8080);//将无符号短整型数值转换为网络字节序,即将数值的高位字节存放到内存中的低位字节0X1234变为0X3412
if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0)//将ip地址在“点分十进制”和整数之间转换
{
cout<<"inet_ptons error"<<endl;
exit(0);
}
if(connect(sockfd,(sockaddr*)&servaddr,sizeof(servaddr))<0)
{
cout<<"connect error"<<endl;
exit(0);
}
while((n=read(sockfd,recvline,MAXLINE))>0)
{
recvline[n]=0;
if(fputs(recvline,stdout)==EOF)
{
cout<<"fputs error"<<endl;
exit(0);
}
}
if(n<0)
{
cout<<"read error"<<endl;
exit(0);
}
exit(0);
}

2. 服务器
约定双方的传输协议(UDP或者TCP),根据传输协议创建socket;
将地址和端口绑定到socket;
对端口进行侦听,直到侦听到有连接信息;
接收连接,然后将数据写回连接中。
将地址和端口绑定到socket

[cpp]
<SPAN style="FONT-SIZE: 18px"><STRONG>#include<string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include <sys/errno.h>
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
using namespace std;

const int MAXLINE=1024;
int main(int argc,char **argv)
{
int listenfd,connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
listenfd=socket(AF_INET,SOCK_STREAM,0);//建立socket
if(listenfd<0)
{
cout<<"socket error "<<strerror(errno)<<endl;
exit(0);
}
memset(&servaddr,0, sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8080);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
int bindfd=bind(listenfd,(sockaddr*)&servaddr,sizeof(servaddr));//将地址和端口绑定到socket
if(bindfd<0)
{
cout<<"bind error"<<bindfd<<endl;
exit(0);
}
listen(listenfd,MAXLINE);//监听连接,一直阻塞,直到有连接出现
while(1)
{
connfd=accept(listenfd,(sockaddr*)NULL,NULL);//接收连接传递的数据
ticks=time(NULL);
snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
cout<<strlen(buff)<<endl;
write(connfd,buff,strlen(buff));//将传递的数据写回到socket中
close(connfd);
}
return 0;
} </STRONG></SPAN>
#include<string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include <sys/errno.h>
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
using namespace std;

const int MAXLINE=1024;
int main(int argc,char **argv)
{
int listenfd,connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
listenfd=socket(AF_INET,SOCK_STREAM,0);//建立socket
if(listenfd<0)
{
cout<<"socket error "<<strerror(errno)<<endl;
exit(0);
}
memset(&servaddr,0, sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8080);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
int bindfd=bind(listenfd,(sockaddr*)&servaddr,sizeof(servaddr));//将地址和端口绑定到socket
if(bindfd<0)
{
cout<<"bind error"<<bindfd<<endl;
exit(0);
}
listen(listenfd,MAXLINE);//监听连接,一直阻塞,直到有连接出现
while(1)
{
connfd=accept(listenfd,(sockaddr*)NULL,NULL);//接收连接传递的数据
ticks=time(NULL);
snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
cout<<strlen(buff)<<endl;
write(connfd,buff,strlen(buff));//将传递的数据写回到socket中
close(connfd);
}
return 0;
}
Storm代理
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto... 点击进入详情页
本回答由Storm代理提供
匿名用户
2015-05-29
展开全部
// 思路是发送一个http请求,然后从response字符串里截取出Date部分,这样得到的时间是GMT格式的,不过转本地时间也很容易了

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#pragma comment(lib, "ws2_32.lib")

int main()
{
    WSADATA wsaData;
    addrinfo hints, *rs;
    sockaddr_in serveraddr;
    SOCKET s;
    char host[256], hostIP[256], request[1024], *p;
    int rc, nBytes;

    WSAStartup(MAKEWORD(2, 2), &wsaData);
    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

printf("plz input host name(eg.www.example.com):");
    gets(host);
    ZeroMemory(&hints, sizeof(addrinfo));
    hints.ai_flags = AI_PASSIVE;
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    rc = getaddrinfo(host, "80", &hints, &rs);

    if(rc != 0) {
        printf("getaddrinfo failed with error code:%d\n", WSAGetLastError()());
        goto clean;
    }
    
    getnameinfo(rs->ai_addr, rs->ai_addrlen, hostIP, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
    printf("server ip is: %s\n", hostIP);
    freeaddrinfo(rs);

serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr(hostIP);
    serveraddr.sin_port = htons(80);

    rc =  connect(s, (SOCKADDR*) &serveraddr, sizeof(serveraddr));
    if(rc != 0) {
        printf("connect to server failed.");
        goto clean;
    }
    
    strcpy(request, "GET / HTTP/1.1\r\n");
    strcat(request, "Host: ");
    strcat(request, host);
    strcat(request, "\r\nConnection: close\r\n\r\n");
    send(s, request, strlen(request), 0);
    while(1)
    {
        nBytes = recv(s, request, 1024, 0);
        if(nBytes == SOCKET_ERROR)
        {
            printf("recv failed with error %d\n",WSAGetLastError()());
            goto clean;
        } else {
            p = strstr(request, "Date:");
            p += 5;
            while(*p == ' ') ++p;
            printf("server time: ");
            while(*p != '\r')
                putchar(*p++);
            putchar('\n');
            break;
        }

    }
clean:
    closesocket(s);
    WSACleanup();
    return 0;
}
更多追问追答
追问
问下 这个我g++执行后各种报错。。我是要从哪先下载上面的文件是么?
这个是放在客户端直接执行么?服务器不用其他的东西吗?
追答
Winsock2 SPI(Service Provider Interface)服务提供者接口建立在Windows开放系统架构WOSA(Windows Open System Architecture)之上,是Winsock系统组件提供的面向系统底层的编程接口。
你用的是g++,就应该查找g++的API啊。或者参考Linux 网络编程。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
侦探章邯
2015-05-29 · TA获得超过579个赞
知道小有建树答主
回答量:830
采纳率:0%
帮助的人:609万
展开全部
#include<winsock2.h>
#pragma comment (lib,"ws2_32")
 
int main(int argc, char* argv[])
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2),&wsaData);
 
    SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
/*struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};
*/
    sockaddr_in socketaddr;
    socketaddr.sin_family = PF_INET;
    socketaddr.sin_addr.S_un.S_addr =  inet_addr("127.0.0.1");
    socketaddr.sin_port = htons(827);
 
    bind(s, (SOCKADDR*)&socketaddr, sizeof(SOCKADDR));
 
    listen(s,1);
 
    SOCKADDR clientAddr;
    int nSize = sizeof(SOCKADDR);
    SOCKET clientSock;
    clientSock = accept(s,(SOCKADDR*)&clientAddr,&nSize);
 
    send(clientSock,"hello world!\r\n",strlen("hello world!\r\n")+sizeof(char),NULL);
 
    closesocket(clientSock);
    closesocket(s);
 
    WSACleanup();
 
    return 0;
}
追问
问一下 
#include
#pragma comment (lib,"ws2_32")
这个包是从哪里下载呢?
这个需要客户端 服务器 都放这个么?
求解。。谢谢
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式