c - 客户端选择的有效 while 循环条件(Linux 中的 TCP 连接 - C)

标签 c networking tcp file-transfer

我正在尝试建立一个 TCP 文件传输连接,使客户端能够选择他想要执行的“任务”(列出目录中的文件、上传、下载文件),但一旦做出选择就不会终止。这意味着他在每次训练中可以做多个选择。

我遇到的问题是在服务器端实现 while 循环时:

while(n= read(sd,rbuf,BUFLEN)){


    if (rbuf[0] == 'R'){//CHANGE DIR
        //char *dircha;

        //read(sd, rbuf, BUFLEN);


        printf("ENTER change directory\n");
        //chdir(dircha);// this will change directory
    }

    if(rbuf[0] == 'L'){//LIST FILES

        requiem[0] = 'I';
        requiem[1] =  20;
        printf("TYPE: %c", requiem[0]);
        write(sd, requiem , 2);.... //rest of code

rbuf 不会被“清除”,并且仍然包含客户端在输入选择时所输入的字符,一旦进入 while 循环并选择一个选择,它将永远无法选择另一个任务,因为 rbuf[0]永远不会等于我所做的任何选择。

我该怎么做才能让用户可以做出多种选择?非常感谢!

最佳答案

while(n= read(sd,rbuf,BUFLEN)){

不是实现协议(protocol)的好方法。无法保证它返回恰好一个数据集。例如。有可能:

  • read() 从两个或多个 write() 返回数据,或者
  • read() 仅从 write() 返回部分数据

您应该对数据实现一些缓冲或更好的编码(例如,始终将后续数据的类型或长度作为前缀)。

关于c - 客户端选择的有效 while 循环条件(Linux 中的 TCP 连接 - C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19748773/

相关文章:

c - 在 C 中,如何确保初始化字符串的长度小于指定的长度

c# - SslStream.BeginRead 方法示例

c - 为什么这个字符串反转 C 代码会导致段错误?

c - 未定义的数组成员不为零! (C)

internet-explorer - GetHostByAddr()Win32

c++ - 处理 tcp/udp 接收的最佳方式。

http - http2 TCP 连接何时关闭?

java - Netty:在服务器启动后启动客户端,为什么需要另一个线程?

c - 如何根据数组在不同行中的升序和降序打印c中的数组?

docker - jenkins中的另一个云插件未使用ec2实例连接到tcp://docker:2376