我的代码在客户端数据发送后,阻塞形式等待结果时候,等待时间超过2分钟的话,就是出现WSAECONNRESET这个问题,select设定超过2分钟的时间也无效,不到2分钟就没有问题。用抓网络数据包工具看客户端的网络数据,发现那次连接服务器段的数据在2分钟后正常返回了,感觉不是服务器的问题。可是客户段程序的所使用的连接确在等待2分钟时候断掉了,不知道是什么原因。系统是xp,谁知道原因呀~~~
代码如下:
int sendMsg(int sd,
const char* szSendBuffer,
char* szReceiveBuffer)  
{
int     n;               /* number of characters read           */
char    szBuffer[READONCE_BUFFER_LEN]; //接收缓冲

struct  fd_set set; 
struct timeval timeout={180,0}; //select等待180秒
int selectVal;
int errorCode;
n = send(sd,szSendBuffer,strlen(szSendBuffer),  MSG_OOB);
if(n <0)
{
MessageBox(NULL, "发送数据失败!", "连接税库银行系统", MB_OK );
return -1;
}
/**
s为欲中断连接的套接字。
How为描述禁止哪些操作,取值为:SD_RECEIVE、SD_SEND、SD_BOTH。 #define SD_RECEIVE 0x00
#define SD_SEND 0x01
#define SD_BOTH 0x02
*/
shutdown(sd, 0x01);
memset(szReceiveBuffer,0,sizeof(szReceiveBuffer));
memset(szBuffer,0,sizeof(szBuffer)); while(1){
FD_ZERO(&set);
FD_SET(sd, &set);
timeout.tv_sec=180;
                  //两分钟后跳出select方法
selectVal=select(0,&set,NULL,NULL,&timeout);
if (selectVal==0){
return -1;
}
else{
if(FD_ISSET(sd, &set)){
n=recv(sd,szBuffer,sizeof(szBuffer),0);
errorCode=WSAGetLastError();
                                     //这里中断了
if (errorCode==WSAECONNRESET){
MessageBox(NULL, "连接过程中网络中断", "系统", MB_OK );
return -1;
}
if (n>0){
strcat(szReceiveBuffer, szBuffer);
}else if (n<0){
continue;
}else{
break;
}
}

}
}#ifdef _DEBUG
MessageBox(NULL, szReceiveBuffer, "系统返回:", MB_OK );
#endif
return n;
}

解决方案 »

  1.   

    没人知道吗??顺便说一下,程序是dll的代码。
      

  2.   

    问题找了个变通的方法解决,加了socket自身的心跳机制,就没有2分钟的限制了,不过不明白为什么socket读操都作为阻塞模式,socket底层还是可以通过心跳机制向服务端发送数据,还有这个两分钟的限制到底是从哪里限制的。
      

  3.   

    int nTime = 90000;  //90秒内没有数据传送,断开连接
    setsockopt(sClient[nCount], SOL_SOCKET, SO_RCVTIMEO, (char*)&nTime, sizeof(int)) != 0);
     你试一下用这个函数设置超时看。
      

  4.   

    你的机器是不是在NAT内网下面?如果是的话,那应该是NAT设备超时关闭掉的。
      

  5.   

    呵呵,因该是nat关闭的,所以长连接必须要用心跳来维持连接。