2012-01-16 33 views
0

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

我假设我将不得不使用循环来检查读或写函数返回的字节数。

像这样的东西可能是:

#define BUFFER 20 
char buffer[BUFFER]; 

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

而且我怎么会确保所有字节我想用写传输()已经被传染?

感谢您的帮助!

+0

完全相同的方式.... – 2012-01-16 02:35:19

回答

1

是的,就像那样。典型的读取逻辑如下所示:

1)致电read

2)我们是否得到EOF或错误?如果是这样,返回。

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

4)转到步骤1.

需要注意的是,当你调用read,你需要一个指针传递它的数据后,缓冲区已被读取,并且你需要尝试读取不会溢出缓冲区的适当数量的字节。另外,如何告诉你是否收到所有字节取决于协议。

要写入:

1)调用write,指针传递到所述第一未写入的字节和未写的字节数。

2)我们得到零或错误?如果是这样,返回。

3)我们写了所有的字节吗?如果是这样,返回。

4)转到步骤1.

注意,你必须适当地调整用于阻塞或非阻塞套接字。例如,对于非阻塞套接字,您必须处理EWOULDBLOCK

+0

感谢您的澄清。 我唯一的问题仍然是如何确定使用read()函数(上面的第3步)时要检查的字节数,如果您不知道应该接收的确切数量。发送方是否应该使用期望的字节数来启动消息,以便接收方可以使用第一个字节来确定消息其余部分的长度(以字节为单位)? Write()显然很容易测试,因为发送的消息可以通过写入过程看到。 – pandaEater 2012-01-16 03:42:27

+1

您应该遵循您正在实施的协议的规范。如果它说发送者应该给消息加上期望字节数,那么你应该这样做。如果它说消息以CRLF终止,那么你应该这样做。遵循规范。 (如果它是你自己的协议,那么做出适当的规范是非常值得的,然后遵循它。) – 2012-01-16 03:50:26

+0

再次感谢您的帮助。顺便说一句,我使用tcp,我不确定我是否必须检查,但我找不到任何快速谷歌搜索的答案。我会花更多的时间研究。 – pandaEater 2012-01-16 03:53:03