winsock套接字的recv函数

Posted

技术标签:

【中文标题】winsock套接字的recv函数【英文标题】:recv function for winsock socket 【发布时间】:2013-07-31 14:04:32 【问题描述】:

我有一个与 telnet 客户端连接的服务器应用程序(即 telnet localhost _port_num - 这里的端口号与服务器应用程序相关联),

我的应用程序工作正常,但问题是我使用了如下的 recv:

#define BUFLEN 512
char buf[BUFLEN];
iResult = recv(sd, (char *)buf, BUFLEN, 0);

只要在连接的 telnet 终端上按下任何字符,recv 调用就会返回,并且大部分时间 iResult 是 1 或有时是 2,即使我不会按 Enter telnet 客户端发送包含单个字符到服务器应用程序。

如何确保在 BUFLEN 读取后 recv 应该返回? 如果 linux recv 按预期工作,获取块直到enter

非常感谢任何帮助或指点。

【问题讨论】:

【参考方案1】:

问:我怎样才能确保... BUFLEN 阅读?

答:你会循环阅读,直到你得到所有你期望的字符。或者直到您遇到超时或错误。

【讨论】:

但我想这不是正确的方法,recv 应该阻止直到在 telnet 终端中按下输入键。如果字节数超过它将读取到 BUFLEN 并引发适当的错误 falg,并且 telnet 将保留未读取的数据,并且在下一次读取时,我可以从剩余的位置读取...我的部分是为什么 recv 返回为只要在 telnet 上输入一个字符 'recv 应该阻止,直到在 telnet 终端中按下输入键' - 不。无论您多么希望 recv() 的记录行为符合您的期望、设计和代码,它都不会改变。 您能浏览一下您的评论吗?您的意思是即使我们不通过 telnet 终端按回车键,它也会发送字符。是不是和linux中的telnet客户端矛盾? 这里我要注意的是,在 windows 中使用 Putty telent 客户端的行为与在 Linux 中相同。【参考方案2】:

您需要一次又一次地调用 recv 函数,直到收到所需的数据量。请注意,当您使用 TCP 套接字时,您无法确定是否在一次接收调用中接收到所有数据。如果您使用单个 TCP Send() 调用发送数据,那么您很有可能在多个接收中接收它,因为 TCP 套接字是流套接字。

recv() 函数返回接收到的字节数,因此您可以继续调用该函数,直到获得所有字节。

【讨论】:

以上是关于winsock套接字的recv函数的主要内容,如果未能解决你的问题,请参考以下文章

winsock c++中recv函数的奇怪行为

Winsock2 - 如何使用 MSG_WAITALL 打开允许 ​​recv() 的 TCP 套接字?

奇怪的 Winsock recv() 减速

Select模型

C++ winsock 错误

面临 recv() 和 send() winsock api 的问题。 Recv() 在接收最后一个数据包时挂起