2010-01-11 31 views
0

我面临着与插座有问题,我会很高兴,如果你能帮助...
的问题是,当我发送不止一次它会阻止更多的数据,如:为什么当向套接字写入多次时,它会阻塞?

//--- client --- 
//.. 
send(sock, buf_1, sizeof(buf_1), 0); 

for (x10){ 
//... 
send(sock, buf_2, sizeof(buf_2), 0);  
if (recv(sock, buf_2, sizeof(buf_2), 0)<0) printf("recv_2() failed"); 
//... 
} 

for (x20){ 
//... 
send(sock, buf_3, sizeof(buf_3), 0);  
if (recv(sock, buf_3, sizeof(buf_3), 0)<0) printf("recv_3() failed"); 
//...  
} 
//...   

//--- server--- 
//... 
if (recv(sock, buf_1, sizeof(buf_1), 0)<0) printf("recv_1() failed"); 

for (x10){  
if (recv(sock, buf_2, sizeof(buf_2), 0)<0) printf("recv_2() failed");  
//...  
send(sock, buf_2, sizeof(buf_2), 0);  
}  

for (x20){ 
if (recv(sock, buf_3, sizeof(buf_3), 0)<0) printf("recv_3() failed"); 
//...  
send(sock, buf_3, sizeof(buf_3), 0);  
}  
//... 

交换块刚在第一个send()之后,有什么想法吗?
udp是否支持多个sendto()

感谢您的回答 -

+0

如果要异步发送,请使用异步调用。 – 2010-01-11 03:42:22

+0

服务器似乎在recv()处被阻塞。打印第一个recv()得到的内容,并确保代码实际到达服务器中的第一个send()。 – 2010-01-11 04:52:21

+0

感谢您的回复。在第一次recv()之后,它会被阻塞。没有错误显示 – Apollo 2010-01-11 13:08:54

回答

3

在这种情况下send和recv都被阻塞。 您需要在套接字上设置异步标志(O_NONBLOCK,我认为 - 请参阅fnctl的文档)。 但是,这可能是棘手的,以得到正确的。如果你不发送/获取所有的数据,你必须保持调用send/recv,直到你完全掌握了所有的数据,并且有效地这样做意味着你将不得不在你的套接字上使用select系统调用。

现在所有这些都是非常可行的,但调试起来并没有多少乐趣和痛苦。 我建议你尝试boost :: asio(异步io)库,而不是玩原始套接字。 http://www.boost.org/doc/libs/1_41_0/doc/html/boost_asio.html

+0

谢谢!问题不在于异步发送/接收,而是同步 – Apollo 2010-01-11 13:10:12

1

UDP或TCP?

如果TCP;您发送的数据有多大?客户在做什么?客户端是否实际接收和处理第一块数据?可能发生的情况是第二次发送呼叫被阻塞,因为你的客户端的接收窗口已满并且TCP堆栈已经进行流量控制,这会导致你的同步发送阻塞,等待对方读取足够的数据,以致recv窗口不是充分和流量控制的情况已经过去了......

还要注意的是,如果你处理TCP那么recv的调用可以将返回任意数目的字节在1和你发送的字节数之间;你应该总是循环累加你的消息帧告诉你需要的字节数...

你提到,在你的问题的最后,关于UDP和多个sendTos,这与你的问题有什么关系?事实上,你在这里使用UDP套接字吗?

+0

谢谢!此时,我正在使用TCP,并在第一次recv后阻塞。服务器只收到buf_1并停止,而客户端不做任何事情。我也设想为这个应用程序使用UDP。 – Apollo 2010-01-11 17:59:26

+0

你的问题仍然非常模糊,但如果'服务器'注释之后的代码在第一次recv之后阻塞(这就是你的建议),那么完全可以预料,因为recv将返回尽可能多的字节。正如我在上面的回复中所说的,您需要更好地管理您的recv呼叫;你的代码,因为它的所有数据可能被第一recv读取... – 2010-01-11 20:00:46

+0

对不起,问题不是模糊的,但技术... 感谢您的答案无论如何... – Apollo 2010-01-23 21:55:13