用SOCKET编程时,怎样设定超过20秒SOCKET没有连接上就发一个通知? 用SOCKET编程时,怎样设定SOCKET超过20秒没有连接上就发一个通知? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 FD_SET readfds; readfds.fd_count=1; readfds.fd_array[0]=Service_Socket; timeval theval; theval.tv_sec=60;//20 theval.tv_usec=0;if (select(0, &readfds,NULL,NULL,&theval)<=0){//发送通知包} 另开一个线程DWORDThread1(...){ if ( WaitForSingleObject(hEvent,20000) == TIME_OUT ) ...........} if (WSAStartup(MAKEWORD(2,2),&wsd)) { printf("WSAStartup run failed,errno=%d!\n",GetLastError()); return 1; } if ((sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR) { printf("socket run failed,errno=%d!\n",WSAGetLastError()); WSACleanup(); return 1; } memset(&local,0,sizeof(struct sockaddr_in)); local.sin_family=AF_INET; local.sin_port=htons(8889); local.sin_addr.s_addr=inet_addr("127.0.0.1"); if (bind(sClient,(struct sockaddr *)&local,sizeof(local))==SOCKET_ERROR) { printf("bind run failed,errno=%d!\n",WSAGetLastError()); closesocket(sClient); WSACleanup(); return 1; } memset(&server,0,sizeof(struct sockaddr_in)); server.sin_family=AF_INET; server.sin_port=htons(iPort); if ((server.sin_addr.s_addr=inet_addr(SIPInfo))==INADDR_NONE) { if ((host=gethostbyname(SIPInfo))==NULL) { printf("gethostbyname run failed,errno=%d!\n",WSAGetLastError()); closesocket(sClient); WSACleanup(); return 1; } memcpy(&(server.sin_addr),host->h_addr_list[0],host->h_length); if (server.sin_addr.s_addr==INADDR_NONE) { printf("invalid server ip address,errno=%d!\n",WSAGetLastError()); closesocket(sClient); WSACleanup(); return 1; } } if (ioctlsocket(sClient,FIONBIO,&NonBlock)==SOCKET_ERROR)//将client socket设为非阻塞 { printf("ioctlsocket run failed,errno=%d!\n",WSAGetLastError()); closesocket(sClient); WSACleanup(); return 1; } FD_ZERO(&WriteSet); FD_SET(sClient,&WriteSet); FD_ZERO(&ExceptSet); FD_SET(sClient,&ExceptSet); tout.tv_sec=20; tout.tv_usec=0; connect(sClient,(const struct sockaddr *)&server,sizeof(server)); if (select(0,NULL,&WriteSet,&ExceptSet,&tout)<1) { printf("select run failed,errno=%d!\n",WSAGetLastError());//errno为0则超时,否则select运行失败 closesocket(sClient); WSACleanup(); return 1; } if (FD_ISSET(sClient,&ExceptSet)) { printf("connect failed,errno=%d!\n",WSAGetLastError()); closesocket(sClient); WSACleanup(); return 1; } if (FD_ISSET(sClient,&WriteSet)) printf("connect successfully,server ip address is:%s,port is:%d.\n",inet_ntoa(server.sin_addr),ntohs(server.sin_port)); socket //创建socketsetsockopt//设置异步connect//while (time < 20s) if (select返回) return; else sleep 用异步的,开一个timer计时,另设一个变量作为超市的通知变量 请教:显示、隐藏非模态窗口的办法 怎么编写mfc单击菜单栏弹出窗口响应代码 有没有这样的api? 禁止客户端用户名重复使用问题! 请问如何把char *开头的空格去掉? 回报社会!提供《win32多线程程序设计》源代码下载!!! 关于Z-Order的问题 怎样获取进程地址 一道面试题 比较好的ATL学习顺序 ~在线等~!!哪位高手能帮忙解决ActiveX控件发布的问题,马上送200分!! 关于vector排序问题..???
readfds.fd_count=1;
readfds.fd_array[0]=Service_Socket;
timeval theval;
theval.tv_sec=60;//20
theval.tv_usec=0;
if (select(0, &readfds,NULL,NULL,&theval)<=0)
{
//发送通知包
}
DWORDThread1(...)
{
if ( WaitForSingleObject(hEvent,20000) == TIME_OUT )
...........
}
{
printf("WSAStartup run failed,errno=%d!\n",GetLastError());
return 1;
}
if ((sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
{
printf("socket run failed,errno=%d!\n",WSAGetLastError());
WSACleanup();
return 1;
}
memset(&local,0,sizeof(struct sockaddr_in));
local.sin_family=AF_INET;
local.sin_port=htons(8889);
local.sin_addr.s_addr=inet_addr("127.0.0.1");
if (bind(sClient,(struct sockaddr *)&local,sizeof(local))==SOCKET_ERROR)
{
printf("bind run failed,errno=%d!\n",WSAGetLastError());
closesocket(sClient);
WSACleanup();
return 1;
}
memset(&server,0,sizeof(struct sockaddr_in));
server.sin_family=AF_INET;
server.sin_port=htons(iPort);
if ((server.sin_addr.s_addr=inet_addr(SIPInfo))==INADDR_NONE)
{
if ((host=gethostbyname(SIPInfo))==NULL)
{
printf("gethostbyname run failed,errno=%d!\n",WSAGetLastError());
closesocket(sClient);
WSACleanup();
return 1;
}
memcpy(&(server.sin_addr),host->h_addr_list[0],host->h_length);
if (server.sin_addr.s_addr==INADDR_NONE)
{
printf("invalid server ip address,errno=%d!\n",WSAGetLastError());
closesocket(sClient);
WSACleanup();
return 1;
}
}
if (ioctlsocket(sClient,FIONBIO,&NonBlock)==SOCKET_ERROR)//将client socket设为非阻塞
{
printf("ioctlsocket run failed,errno=%d!\n",WSAGetLastError());
closesocket(sClient);
WSACleanup();
return 1;
}
FD_ZERO(&WriteSet);
FD_SET(sClient,&WriteSet);
FD_ZERO(&ExceptSet);
FD_SET(sClient,&ExceptSet);
tout.tv_sec=20;
tout.tv_usec=0;
connect(sClient,(const struct sockaddr *)&server,sizeof(server));
if (select(0,NULL,&WriteSet,&ExceptSet,&tout)<1)
{
printf("select run failed,errno=%d!\n",WSAGetLastError());//errno为0则超时,否则select运行失败
closesocket(sClient);
WSACleanup();
return 1;
}
if (FD_ISSET(sClient,&ExceptSet))
{
printf("connect failed,errno=%d!\n",WSAGetLastError());
closesocket(sClient);
WSACleanup();
return 1;
}
if (FD_ISSET(sClient,&WriteSet))
printf("connect successfully,server ip address is:%s,port is:%d.\n",inet_ntoa(server.sin_addr),ntohs(server.sin_port));
setsockopt//设置异步
connect//
while (time < 20s) if (select返回) return; else sleep