c - Recv() 一次一行

标签 c sockets recv

我最近在学习如何用 C 编写一个基本的网络服务器。我的服务器根据某些输入将发送各种文本行,所有文本行都以空行结尾,我需要以某种方式从客户端接收它们以一次显示一行。

现在服务器做类似的事情

send(socket, sometext, strlen(sometext), 0)
send ...
send(socket, "\n", 2, 0);

....

客户:

目前我正在做的是使用 fdopen 包装套接字文件描述符并使用 fgets 读取:

FILE *response = fdopen(someSocket, "r");
while(1){
            fgets(input, 500, response);

        if(strcmp(input, "\n") != 0){
            //do some stuff
        }
        else {
            // break out of the loop
            break;
        }
}

除了我的程序需要满足一个条件外,这一切都很好,那就是永远不要断开套接字连接。因为我打开了一个文件,为了阻止内存泄漏,之后的下一行是:

fclose(response);

然而,这是我问题的根源,因为它不仅关闭了文件,还关闭了套接字,这是我无法拥有的。谁能给我任何解决此问题的简单方法的指导?我正在考虑也许使用 recv() 但不是必须一次接收整个消息吗?有什么方法可以使用 recv 重新创建 fgets 的行为吗?

我真的是个新手,谢谢大家的帮助!

最佳答案

您遇到的另一个问题是 FILE 可能从您的套接字中读取了更多数据(超过空行)并对其进行了缓冲,如果您关闭 FILE<,这些数据将会丢失。这两个问题的解决方案是不关闭 FILE —— 只需在第一次创建套接字时(紧接在之后)用 fdopen 创建一个 FILE connectaccept 调用),并将其用于从套接字读取的所有数据。

另一个注意事项:send(socket, "\n", 2, 0); 将发送一个换行符和一个空值——您可能需要 send(socket, "\n ", 1, 0);send(socket, "\n\n", 2, 0); 取决于其他发送正在做什么。

关于c - Recv() 一次一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8335024/

相关文章:

c - fopen()、fclose() 究竟是如何工作的?

c - 使用 setuid 降低到较低权限级别的正确方法是什么?

c - 如何修改recv来实现IO/非阻塞?

c - 使用带套接字的 C 中的 I/O 从服务器接收响应

c - 在 C 中将文件中的多个整数扫描到整数数组中

c - 排序程序 C 中的段错误

java - 套接字连接半断开 - 未抛出 IOException

java - Home Brew Java HTTP 服务器无法正确提供非文本文件

c - Linux 套接字终止监听线程

c - C 中的 HTTP 代理,recv() 不会阻塞?