我最近在学习如何用 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
connect
或 accept
调用),并将其用于从套接字读取的所有数据。
另一个注意事项: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/