C++通过TCP向服务器请求时间
在linux下用C++通过TCP从客户端向服务器发送请求然后服务器给客户端返回时间求解linux的服务器跟客户端麻烦说一下服务器跟客户端怎么做。。全面一点的教程谢谢!...
在linux下 用C++通过TCP从客户端向服务器发送请求 然后服务器给客户端返回时间
求解 linux的服务器跟客户端
麻烦说一下 服务器跟客户端怎么做。。全面一点的教程 谢谢! 展开
求解 linux的服务器跟客户端
麻烦说一下 服务器跟客户端怎么做。。全面一点的教程 谢谢! 展开
展开全部
客户端向服务器端发送请求,服务器收到请求做相应的处理,将处理结果传回客户端。下面采用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;
}
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 广告
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 网络编程。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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")
这个包是从哪里下载呢?
这个需要客户端 服务器 都放这个么?
求解。。谢谢
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询