100分求助!!!socket被阻塞,是否接受缓冲不够大? 服务器只连一个客户端,没问题。连接两个后,过一会就有一个客户端程序死了,不响应用户操作。关闭死的程序后,重新开一个客户端,就好了。但过一会有死了。是不是服务器客户端socket没有响应,所以客户端的send无法返回,才死的?如何解决? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 所以客户端的send无法返回,才死的.-->不可能。死了只是没有相应而已,多半是出于阻塞状态。检查一下client端有没有recv()一类的阻塞函数。 服务器端用的是OnReceive()死了就是指不再没有响应用户操作啊 I think maybe you did not release the resource after finish using it,maybe your resource is not enough send只负责发到网络上去,不管对方是否收到,如果在send上阻塞,跟服务器端无关,只与本地发送失败有关(也可能是本地缓充区用光)。但你说有一个客户端死掉,就是说有一个没有死,所以应该不是它阻塞了。而且MFC的send是一个非阻塞函数。你可以观察一下使用两个客户端时死的情况,死掉一个后,关掉开一个新的,是否两个客户端都会死,还是先开的不会死。 fd_set chkSockSet ;struct timeval delayTime ;FD_ZERO(&chkSockSet) ; //清空FD_SET(hCleintSock,&chkSockSet) ; //插入代检测的SocketdelayTime.sec = 0 ; //设定检测超时delayTime.usec = 10 ; select(0,&chkSockSet,NULL,NULL,&delayTime) ; //检查可读取端口if(FD_ISSET(hClientSock,&chkSockSet)) { //非零代表端口有数据,可读! nRetVal = recv(hClientSock,buffer,MAX_BUF_LEN,0) ; if(nRetVal == 0 || nRetVal == SOCKET_ERROR) { //错误处理! }}这些应该可以了。 用一个定时器,定时(如10毫秒)调用OnReceive()函数 1 Tcp? Udp?2 socket通讯是端对端的。3 服务器是多线程吗?使用的是什么模型? 如果是单线程的,就一定要用非阻塞socket.如果是多线程的,而且用了阻塞socket,切忌不要在同一个线程里对两个连接进行读写,否则一个连接有问题就会影响到其他连接。你的问题好像是第二种情况。 用的TCP单线程的客户端用的send,服务器端用的OnReceive,应该是非阻塞的吧? 不知道你是用阻塞还是非阻塞?如果用阻塞完全可能发生你所说的情况,所以用阻塞你应该设置发送超时,然后用WSAGetLaseError看返回值。这样用send发送就不会因各种原因而阻塞线程。用非阻塞就不会出现这种情况。 OnReceive是回调函数,应该不阻塞吧?Send好像也不会阻塞吧? OnReceive是回调函数,应该不阻塞吧?Send好像也不会阻塞吧? OnReceive是回调函数,应该不阻塞吧?Send好像也不会阻塞吧? 详细信息查询按钮,点击后总提示如图错误,怎么办 迭代返回值是为空吗 vista32/64 下如何搜寻 explorer 的 HWND? 请教几个MFC函数的用法 分不够可加,问题为:像MapInfor那样的移动如何在MFC中实现? 究竟使用那种项目类型(win32 Application,win32 Dynamic Link library,还是其他) 管道问题? DirectShow和解压卡 现场给分,关于重载虚函数问题 寻找精通Windows底层开发的软件公司 请高手指点-----接口继承的问题? 关于软件结构设计方面的问题(新手勿进)
死了只是没有相应而已,多半是出于阻塞状态。检查一下client端有没有recv()一类的阻塞函数。
死了就是指不再没有响应用户操作啊
而且MFC的send是一个非阻塞函数。
你可以观察一下使用两个客户端时死的情况,死掉一个后,关掉开一个新的,是否两个客户端都会死,还是先开的不会死。
struct timeval delayTime ;
FD_ZERO(&chkSockSet) ; //清空
FD_SET(hCleintSock,&chkSockSet) ; //插入代检测的Socket
delayTime.sec = 0 ; //设定检测超时
delayTime.usec = 10 ;
select(0,&chkSockSet,NULL,NULL,&delayTime) ; //检查可读取端口if(FD_ISSET(hClientSock,&chkSockSet)) { //非零代表端口有数据,可读!
nRetVal = recv(hClientSock,buffer,MAX_BUF_LEN,0) ;
if(nRetVal == 0 || nRetVal == SOCKET_ERROR) {
//错误处理!
}
}
这些应该可以了。
如果是多线程的,而且用了阻塞socket,
切忌不要在同一个线程里对两个连接进行读写,
否则一个连接有问题就会影响到其他连接。你的问题好像是第二种情况。
单线程的
客户端用的send,服务器端用的OnReceive,应该是非阻塞的吧?
Send好像也不会阻塞吧?
Send好像也不会阻塞吧?
Send好像也不会阻塞吧?