gpt4 book ai didi

C unix 套接字编程 read() 问题

转载 作者:太空宇宙 更新时间:2023-11-04 05:44:40 26 4
gpt4 key购买 nike

我正在使用 C 来实现客户端服务器应用程序。客户端向服务器发送信息,服务器使用它来发回信息。我目前正在编写代码来处理数据的接收,以确保实际上接收到所有数据。

我遇到的问题最好在显示一些代码后得到解释:

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;
}

上面的代码在服务器端运行,将打印出 6 次“从客户端读取 1 个字节”,程序将继续正常运行。我在这里硬编码了 6,知道我正在从客户端写入 6 个字节,但我会让我的协议(protocol)要求发送的第一个字节是缓冲区其余部分的长度。

int byteCount = read(hSocket, pBuffer, BUFFER_SIZE);
printf("Read %d bytes from client", byteCount);

上面的代码,用于代替第一个代码段,将打印“从客户端读取 6 个字节”并继续正常工作,但如果只读取 5 个字节,它不能保证我已经收到每个字节。

谁能向我解释为什么会发生这种情况以及可能的解决方案?我想第一种方法确保所有字节都被传送,但一次读取一个字节似乎效率低下......

哦,这是在 fork 的子进程中发生的,我正在使用 tcp/ip。

注意:我的目标是成功实现第一个代码段,这样我就可以确保我正在读取所有字节,但我在正确实现它时遇到了问题。

最佳答案

基本上,执行此操作的正确方法是混合使用您的两个代码片段。做第一个,但不要一次只读一个字节;询问您期望的所有字节。但是看看bytesRead,如果小于你的预期,调整你的目标指针,调整你预期的读取数,然后再次调用read()。这就是它的工作原理:有时您期望的数据会分散在多个数据包中,并且并非同时可用。

阅读您下面的评论并查看您的代码,我感到很困惑,因为是的,这就是您想要做的。但后来我非常仔细地查看了您的代码:

read(hSocket, pos, BUFFER_SIZE - (pos-pBuffer)>0)){
^
|
THIS ---------|

那个“> 0”是包围读取参数的括号内,而不是在外面;这意味着它是参数的一部分!事实上,你的最后一个论点被解释为

(BUFFER_SIZE - (pos-pBuffer)) > 0

一直是1,到最后,变成0。

关于C unix 套接字编程 read() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8889428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com