【问题标题】:C Unix socket programming, ensuring read/write byte counts?C Unix套接字编程,确保读/写字节数?
【发布时间】:2012-01-16 02:31:41
【问题描述】:

我正在编写客户端和服务器程序,并且我正在寻找一种方法来确保在使用 read() 或 write() 到/从客户端/服务器打开的套接字时读取所有字节并发送所有字节.

我假设我必须使用循环来检查从读取或写入函数返回的字节数。

大概是这样的:

#define BUFFER 20
char buffer[BUFFER];

while (I haven't read all bytes from the buffer){
       int bytesRead = read(theSocket, myWord, BUFFER);
 }

我如何确保我尝试使用 write() 传输的所有字节都已传输?

感谢您的帮助!

【问题讨论】:

  • 完全一样的方式......

标签: c sockets networking


【解决方案1】:

是的,完全一样。典型的读取逻辑是这样的:

1) 致电read

2) 我们得到 EOF 还是错误?如果是,请返回。

3) 我们收到所有字节了吗?如果是,请返回。

4) 转到步骤 1。

请注意,当您调用read 时,您需要在已读取数据之后将指针传递给缓冲区,并且您需要尝试读取适当数量的字节溢出缓冲区。此外,如何判断是否收到了所有字节取决于协议。

写作:

1) 调用write,将指针传递给第一个未写入字节和未写入字节数。

2) 我们得到的是零还是错误?如果是,请返回。

3) 我们是否写入了所有字节?如果是,请返回。

4) 转到步骤 1。

请注意,您必须针对阻塞或非阻塞套接字进行适当调整。例如,对于非阻塞套接字,您必须处理EWOULDBLOCK

【讨论】:

  • 感谢您的澄清。我唯一的问题是,如果您不知道应该收到的确切数量,如何确定使用 read() 函数时要检查的字节数(上面的第 3 步)。发送方是否应该以预期字节数开始消息,以便接收方可以使用第一个字节来确定消息其余部分的长度(以字节为单位)? Write() 显然很容易测试,因为正在发送的消息可以被写入过程看到。
  • 您应该遵循您正在实施的协议的规范。如果它说发件人应该在消息前加上预期的字节数,你应该这样做。如果它说消息以 CRLF 终止,那么你应该这样做。遵循规范。 (如果这是您自己的协议,那么制定适当的规范并遵循它是非常值得的。)
  • 再次感谢您的帮助。顺便说一句,我正在使用 tcp,我不确定我是否必须检查,但我无法通过快速谷歌搜索找到任何答案。我会花更多时间研究。
  • 使用TCP实现什么协议呢?这些事情取决于您正在实施的协议与您正在使用的协议一样多。
  • @DavidSchwartz - send() 可以返回 0 吗?如果确实如此,那是否一定会被视为阻塞或非阻塞套接字中的错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2014-06-02
  • 2015-07-20
  • 2015-03-31
  • 2011-12-27
  • 2011-09-25
  • 1970-01-01
相关资源
最近更新 更多