18,356
社区成员
发帖
与我相关
我的任务
分享
SO_RCVTIMEO设置的时间类型是struct timeval,不是int
#ifdef WIN32
#include <winsock2.h>
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#endif
#include <time.h>
#include <unistd.h>
#include <iostream>
using namespace std;
#ifdef WIN32
#pragma comment(lib, "ws2_32.lib")
#endif
void testTimeout()
{
char lsData[2048] = {0};
struct sockaddr_in caddr;
#ifdef WIN32
int ltimeout = 30*1000;
#else
struct timeval ltimeout = {30, 0};
#endif
int lisocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if(lisocket < 0)
return;
caddr.sin_family = AF_INET;
caddr.sin_port = htons(25);
caddr.sin_addr.s_addr = inet_addr("123.125.50.134");//163 smtp server
int liret = connect(lisocket, (const sockaddr*)&caddr, sizeof(caddr));
if(liret != 0)
return;
liret = setsockopt(lisocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)<imeout, sizeof(ltimeout));
liret = recv(lisocket, lsData, sizeof(lsData), 0);
cout<<lsData<<endl;
int t1 = time(NULL);
liret = recv(lisocket, lsData, sizeof(lsData), 0);
int t2 = time(NULL);
int t3 = t2 - t1;
cout<<"t3:"<<t3<<endl;
shutdown(lisocket, 0x02);
close(lisocket);
}
int main()
{
testTimeout();
return 0;
}