我的代码在客户端数据发送后,阻塞形式等待结果时候,等待时间超过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;
}
代码如下:
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;
}
解决方案 »
- RTC通信为什么要双机互连发送连接请求才能通信呢?
- 有关多线程建传递数据的问题(急)!!!
- MFC网络编程--服务器的消息机制
- 请问大家是如何搜索WPARAM wparam,LPARAM lparam两个参数对于不同的Windows消息或回调函数的意义呢?
- 请教在Dialog上轮换贴图的一个问题
- 关于这种方法原理是这样实现啊!
- debug 单步执行(step over),在某一点处执行完函数后,程序使用的内存大小是否应恢复到执行函数前的大小?如果发现不等了,是什么原因
- 如何使视窗最大化?
- 这个警告Warning: skipping non-radio button in group.是为什么?
- MFC有什么用处呀?大家讨论一下!
- 请问图层的功能怎么实现?
- 一个程序需要对硬盘文件进行多次读取、写入、合并等工作,速度较慢,有没有方法将所有文件先读入内存,从而避免对硬盘的操作,提高效率呢
setsockopt(sClient[nCount], SOL_SOCKET, SO_RCVTIMEO, (char*)&nTime, sizeof(int)) != 0);
你试一下用这个函数设置超时看。