繁体   English   中英

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

[英]C unix socket programming read() issue

我正在使用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个字节,但是我将使我的协议要求发送的第一个字节为缓冲区其余部分的长度。

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

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

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

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

注意:我的目标是成功实现第一个代码段,因此我可以确保读取所有字节,但无法正确实现它。

基本上,正确的方法是将两个代码段混合在一起。 做第一个,但不要一次读一个字节。 询问您期望的所有字节。 但是请看bytesRead ,如果它小于您的预期,请调整目标指针,调整预期的read数,然后再次调用read() 这就是它的工作方式:有时,您期望的数据会在数据包之间拆分,并且不能一次全部可用。

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

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

“> 0” 位于括住read的参数的括号内,而不位于外部; 这意味着它是论点的一部分! 实际上,您的最后一个参数被解释为

(BUFFER_SIZE - (pos-pBuffer)) > 0

它是1,直到最后,当它变为0时。

您的代码不太正确。 readwrite可能不会读取或写入您应要求的全部数据量。 取而代之的是,您应该在每次调用之后使读或写指针前进,并计算传输中要提交的剩余字节数。

如果您从readwrite返回负数,则表示错误。 零表示传输已完成(没有更多字节要发送),零以上的任何数字表示在上一次调用中分别readwrite了多少字节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM