聊聊TCP超时

来源:互联网 发布:淘宝天天特价首页 编辑:程序博客网 时间:2024/06/06 18:25

一句话总结:防止阻塞在那里,任务该往下走的时候还要往下走。

1、接收超时,等待N秒,还是没有消息,那就接着往下走

服务端

#include <iostream>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <stdio.h>using namespace std;int main(){struct sockaddr_in serAddr;int listenSock, cnntSock;listenSock = socket(AF_INET, SOCK_STREAM, 0);serAddr.sin_family = AF_INET;serAddr.sin_addr.s_addr = INADDR_ANY;serAddr.sin_port = htons(1270);bind(listenSock, (const struct sockaddr *)&serAddr, sizeof(sockaddr_in));listen(listenSock, 10);struct timeval tv = {3,0};//3.0s 接收超时设置setsockopt(listenSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));struct sockaddr_in cliAddr;socklen_t len = sizeof(sockaddr_in);cnntSock = accept(listenSock, (struct sockaddr*)&cliAddr, &len);cout<< "IP:" <<inet_ntoa(cliAddr.sin_addr) <<", port:"<<cliAddr.sin_port<<endl;unsigned int total = 0;int cnt = 0;while(1){getchar();cout <<"read msg..."<<endl;char buf[6000] = {0};int ret = recv(cnntSock, buf, sizeof(buf), 0); //wait 3 sec,超过3秒返回-1,继续往下走total += ret;cout << "msg:" <<endl;cout << buf;cout << "recv msg size:" << ret << ",total size:" << total <<endl;cnt++;if (5==cnt)break;}close(cnntSock);close(listenSock);return 0;}
客户端

#include <iostream>#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>using namespace std;int main()  {      int sockClient = socket(AF_INET, SOCK_STREAM, 0);      struct sockaddr_in addrSrv;      addrSrv.sin_addr.s_addr = inet_addr("127.0.0.1");      addrSrv.sin_family = AF_INET;      addrSrv.sin_port = htons(1270);     struct timeval tv = {3,0};//3s 超时    setsockopt(sockClient, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval));     connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));           char buf[10] = {0};      for(unsigned int i = 0; i < 10; i++)     {          buf[i] = 'd';       }            int ret = send(sockClient, buf, sizeof(buf) , 0);       cout << "buf size:" << sizeof(buf) << "ret:" << ret <<endl;     getchar();    for(unsigned int i = 0; i < 10; i++)     {          buf[i] = 'p';       }     ret = send(sockClient, buf, sizeof(buf) , 0);       cout << "buf size:" << sizeof(buf) << "ret:" << ret <<endl;     getchar();      close(sockClient);        return 0;  }  

运行结果: