我使用C来实现客户端服务器应用程序。客户端向服务器发送信息,服务器使用它发回信息。我目前正在编写处理数据接收的代码,以确保它实际上已经收到。C unix套接字编程读取()问题
我遇到的问题表现出一些代码后,最好的解释:
int totalRead = 0;
char *pos = pBuffer;
while(totalRead < 6){
if(int byteCount = read(hSocket, pos, BUFFER_SIZE - (pos-pBuffer)>0)){
printf("Read %d bytes from client\n", byteCount);
pos += byteCount;
totalRead += byteCount;
}else return -1;
}
上面的代码运行在服务器端,将打印出“阅读从客户1个字节的” 6倍,并计划将继续正常工作。我在这里硬编码6,知道我正在从客户端写入6个字节,但我会让我的协议要求发送的第一个字节是缓冲区其余部分的长度。
int byteCount = read(hSocket, pBuffer, BUFFER_SIZE);
printf("Read %d bytes from client", byteCount);
上面的代码,取代第一代码段的使用,将打印“阅读客户端,从6个字节”,并继续工作正常,但如果只有5人读它并不能保证我收到的每个字节例如。
任何人都可以向我解释为什么会发生这种情况和一个可能的解决方案?我猜第一种方法确保所有字节正在交付,但它看起来效率低下一次读取一个字节...
哦,这是发生在一个分叉子进程,我使用tcp/ip。
注意:我的目标是成功实现第一个代码段,以便确保我正在读取所有字节,但我无法正确执行。
您的协议还应该包含一些长度或内容分隔符,以便让对方知道应该何时停止接收数据(类似于HTTP中的“Content-Length”或分块编码)。请参阅http://stackoverflow.com/a/6404085/372643 – Bruno 2012-01-17 15:08:17