1

当发送方按照此处指定的方式正常关闭套接字连接时,我尝试通过网络获取 0 的值。当我使用无阻塞呼叫时,在数据从发送方发送到接收方之前,我在 UDP 流中得到了 -1。发送原始数据后,当我关闭连接(尝试关闭套接字并关闭发送方的套接字)时,我仍然得到 -1 而不是 0 表示套接字已关闭。任何人都可以请帮助是否有任何方法可以得到相同的。

谢谢。

4

2 回答 2

3

当 UDP 套接字被close(2)-ed 时,即使套接字被connect(2)-ed,也不会发送任何内容。另一方面,TCP 启动四向连接拆除。看起来你混淆了这两种情况。

于 2012-11-28T15:21:04.160 回答
1

用于关闭的 UNIX 手册页说明以下内容:

返回值:

成功时,返回零。出错时,返回 -1,并适当设置 errno。

错误:

EBADF - sockfd 不是有效的描述符。
ENOTCONN - 指定的套接字未连接。
ENOTSOCK - sockfd 是一个文件,而不是一个套接字。

和windows平台大同小异:

返回值

如果没有发生错误,shutdown 将返回零。否则,返回 SOCKET_ERROR 的值,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。

事情是:UDP 不是面向连接的协议,并且 connect() 调用它并不意味着建立任何关联。

所以我猜,你实际上得到了 ENOTCONN 错误(或 WSAENOTCONN,如果你在 Windows 上)检查你的 errno(或 Windows 上的 WSAGetLastError())

于 2012-11-28T15:05:07.540 回答