当前位置:  开发笔记 > 编程语言 > 正文

套接字accept()后无法获取返回值

如何解决《套接字accept()后无法获取返回值》经验,为你挑选了1个好方法。

我有一个客户端/服务器程序.客户运行良好.但是当客户端收到10060错误时,服务器似乎停留在accept()并且无法获得返回值.我怎样才能解决这个问题?我需要accept()来返回错误,以便服务器可以继续做其他事情.

客户代码:

SOCKET sock, sendrecv;  
sendrecv = myInitClientSocket(szIP, 6666);
if ( sendrecv ==0 ){  //socket 10060 error so that myInitClientSocket returns 0
    int err= WSAGetLastError();
    shutdown(sendrecv, 0x02);
    closesocket(sendrecv);
    return 0;
}       

服务器代码:

SOCKET sock, sendrecv;
struct sockaddr_in sock_addr,sendrecv_addr;
WSADATA data;
WORD p;
p=MAKEWORD(2,2);
int resStartup = WSAStartup(p,&data);
sock = WSASocket (AF_INET, SOCK_STREAM, 0, 0, 0, 0);
int nREUSEADDR = 1;
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(const char*)&nREUSEADDR,sizeof(int)); 

sock_addr.sin_family=PF_INET;
sock_addr.sin_port=htons(6666);         
sock_addr.sin_addr.s_addr=INADDR_ANY;
int resBind =   bind(sock,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr_in));
int resListen =listen(sock, 5); 
int lun = sizeof (struct sockaddr);
sendrecv = accept(sock,(struct sockaddr*)&sendrecv_addr,&lun);  //stucking here 
if(sendrecv == INVALID_SOCKET  )   
{
    //can't go in here
    return 5 ;
}

Vovanrock200.. 5

acceptcall不能返回一个值,因为这个调用应该阻止进程的执行并等待客户端到达.如果您什么都不做而且客户端没有出现,accept则不会永远返回.

你需要的是什么

    使用select之前accept查看是否有可用的待处理客户端.

要么

    使用setsockopt设置SO_SNDTIMEO和/或SO_RCVTIMEO选项,使accept退出后的一段时间,甚至立即.

实现细节可以在这里找到:如何接受带超时的套接字和设置套接字超时?



1> Vovanrock200..:

acceptcall不能返回一个值,因为这个调用应该阻止进程的执行并等待客户端到达.如果您什么都不做而且客户端没有出现,accept则不会永远返回.

你需要的是什么

    使用select之前accept查看是否有可用的待处理客户端.

要么

    使用setsockopt设置SO_SNDTIMEO和/或SO_RCVTIMEO选项,使accept退出后的一段时间,甚至立即.

实现细节可以在这里找到:如何接受带超时的套接字和设置套接字超时?

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有