MFC中Socket套接字,连续关闭再打开套接字几次后程序死掉了

时间:2021-05-03 11:00:21
写了一个程序,界面作为客户端(只使用一个套接字),通过网线不断地向设备发指令收数据。发送完一包数据后拔掉网线,隔上一段时间在插上网线,程序死掉了。拔掉网线的这段时间,程序做的工作是:在select下不断地检测socket套接字,检测到出错的话,不断地使用套接字函数closesocket(socket )关闭套接字,然后在用自定义的函数connectsocket()连接,发现进行几次后,程序就死了。同时,再打开网络调试助手,用同样的Ip地址、同样的端口号连接,竟然可以从设备那收发数据。
connectsocket()函数的具体内容是:
UINT8 CCDlg::ConnectSocket()
{
socketclient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
CString IpAddressStr(L"");
USES_CONVERSION;
int nNetTimeOut=5000;
setsockopt(socketclient,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeOut,sizeof(int));
setsockopt(socketclient,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeOut,sizeof(int));

addrSvr.sin_family=AF_INET;
addrSvr.sin_addr.S_un.S_addr =inet_addr("192.168.1.118");
addrSvr.sin_port=htons(6786);

if(connect(socketclient, (SOCKADDR*)&addrSvr,sizeof(SOCKADDR))!=0){
ConnectOk=FALSE;
return 0;
}
else {
ConnectOk=TRUE;
return 1;
}
}
不知道问题在哪?求高手指导一二,谢了~~(不好意思,没分了,分不多)

6 个解决方案

#1


不讨论程序代码,谈谈对流程的意见。
客户端发现网络断开后,应当关闭当前字,重新进行连接。我的作法是:发现网络断开事件,清理现场,打开一个定时器,定时时间到建立连接。连接成功关闭定时器,连接失败清理现场,等待定时时间到再次连接,直至成功,不可能死掉。

#2


回1楼,谢谢你的回答,明天试试。但是有一点不太明白,想问一下清理现场具体指的是什么?

#3




引用 1 楼 wxhxj0268 的回复:
不讨论程序代码,谈谈对流程的意见。
客户端发现网络断开后,应当关闭当前字,重新进行连接。我的作法是:发现网络断开事件,清理现场,打开一个定时器,定时时间到建立连接。连接成功关闭定时器,连接失败清理现场,等待定时时间到再次连接,直至成功,不可能死掉。


回1楼,谢谢你的回答,明天试试。但是有一点不太明白,想问一下 “ 清理现场 ”具体指的是什么?

#4


自己先顶一下,没人了吗

#6


谢谢楼上几位,我先试试~~

#1


不讨论程序代码,谈谈对流程的意见。
客户端发现网络断开后,应当关闭当前字,重新进行连接。我的作法是:发现网络断开事件,清理现场,打开一个定时器,定时时间到建立连接。连接成功关闭定时器,连接失败清理现场,等待定时时间到再次连接,直至成功,不可能死掉。

#2


回1楼,谢谢你的回答,明天试试。但是有一点不太明白,想问一下清理现场具体指的是什么?

#3




引用 1 楼 wxhxj0268 的回复:
不讨论程序代码,谈谈对流程的意见。
客户端发现网络断开后,应当关闭当前字,重新进行连接。我的作法是:发现网络断开事件,清理现场,打开一个定时器,定时时间到建立连接。连接成功关闭定时器,连接失败清理现场,等待定时时间到再次连接,直至成功,不可能死掉。


回1楼,谢谢你的回答,明天试试。但是有一点不太明白,想问一下 “ 清理现场 ”具体指的是什么?

#4


自己先顶一下,没人了吗

#5


#6


谢谢楼上几位,我先试试~~