2012-03-23 53 views
1

我想要一个简单的winsock程序工作,所以我创建我的套接字并发送我的数据就好了。那我按照msdn使用shutdown(ConnectSocket, SD_SEND),禁止发送数据,但没有收到? msdn上的例子也是这样做的。Winsock recv在关机后不工作

但我呼叫shutdown后,我的recv函数返回0,但没有收到任何数据。
如果我将关闭代码注释掉,那么所有内容都可以正常工作。

我错过了什么吗?

+0

的发送部分你有对方的控制?你知道它是否立即关闭连接,一旦它读取0字节(它会,一旦你切断其传入的数据...)? – cHao 2012-03-23 20:43:46

回答

2

不,这很正常。另一方通过关闭来响应你的关机。来自recv的零回返指示正常连接关闭。如果你不希望另一方关闭它的一半连接,请不要关闭你的连接。

(你是怎么想到对方做时,其recv调用返回零?)如果它是一个HTTP协议

+0

我的印象是,如果你指定了'SD_SEND',它只会关闭发送,而不是接收。你必须使用'SD_RECEIVE'来关闭接收。 – Josh 2012-03-23 20:44:07

+2

这是正确的。你关闭你的发送端,另一端通过关闭它的发送端进行响应。这种联系的另一方面是什么?它应该做什么? (您是否与另一方达成了一些协议来继续使用半开连接?) – 2012-03-23 20:44:43

+0

这取决于如何在给定协议中解释关机。例如,在HTTP中,发送请求后客户端发送关闭是(虽然不常见)不能被解释为“不介意你要发送的内容,我不需要回应”。也就是说,如果你正在运行一个简单的echo服务器,服务器很可能会通过关闭来响应。 – 2012-03-23 20:44:51

-3

,使用连接头关闭连接或保持打开:

连接:关闭

在这种情况下,你不需要关闭发送

连接:保持活跃

接收将循环而不关闭连接