recv接收问题,急急急急

导读:
while ((rcvlen = recv(sock, bufptr, buflen, 0)) <= 0)
{
if (wsagetlasterror() != wsaewouldblock)
{
error("socket failed - %d/r/n", wsagetlasterror());
goto rdperror; /* tcp error */
}
else {
int x = wsagetlasterror();
// sleep(20); //当没有sleep的时候,就会不断执行到这里,x返回10035
}
}


上面一段代码,非阻塞socket接收,select模型recv,在单独的测试中运行正常,但是加入到我的server环境中就会不断执行到else这里(单独测试中会正常收到数据,然后我在后边处理),error返回10035。

达人帮忙分析可能的原因,thank u all
发表者:kingzai
10035 是#define wsaewouldblock (wsabaseerr+35)

非阻塞模型里面出现这样的错误不奇怪
http://community.csdn.net/expert/topic/3136/3136885.xml?temp=8.057803e-02
http://community.csdn.net/expert/topic/3246/3246082.xml?temp=4.870242e-02
发表者:realsong
10035不是一个错误,只是说现在没有数据需要接受而已
发表者:kingzai
10035在异步非阻塞中出现并不奇怪,具体你可以参考unix网络编程关于阻塞的章节。
发表者:hunterforpig
this error is returned from operations on nonblocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. it is a nonfatal error, and the operation should be retried later. it is normal for wsaewouldblock to be reported as the result from calling connect on a nonblocking sock_stream socket, since some time must elapse for the connection to be established.

这其实不算什么错误,只不过是非阻塞模型,通知当前操作还未完成....

发表者:aoosang
非阻塞套接字这样写,有点问题,一般来说在接收之前总是要select一下,看看套接字上是否有内容可收,如果有,就接收,没有,跳过,示例代码如下

fd_set my_set;
timeval time_out;
for(;;)
{
fd_zero(&my_set);
fd_set(sock, &my_set);

time_out.tv_sec = time_out.tv_usec = 0; // dont wait

if (select(sock + 1, &my_set, null, null, &time_out) != 1)
{
sleep(200);
continue;
}
rc = recv(sock,tempbuf,nrecv,0);
if( rc==socket_error)
{
closesocket(sock);
return -1;
}

}
发表者:jia20003
先判断socket 上是否有数据~~~~~~~~~
发表者:3m2u
觉得socket是个很复杂的东东.理解得还不够深入 :
10035表示当前资源暂时不可获得,等待一下

本文转自
http://web.java-asp.net/doc/p401/J40149376.shtml
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值