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函数的主要内容,如果未能解决你的问题,请参考以下文章