c - 从字符串中可靠地拆分行

标签 c string networking

我正在用 C 编写一个小型服务器守护程序,处理连接、断开连接和接收等基本部分已经在,但接收问题仍然存在。

我使用“recv”一次将 256 个字节读取到一个 char 数组中,因为它可以包含多行数据作为一个大块,所以我需要能够分别拆分每一行来处理它。 这本身不是问题,但由于一条线可能因为它不再适合缓冲区而被切断,我还需要能够查看一条线是否已被切断。还不错,只需检查 \r\n 的最后一个字符,但是如果该行被切断怎么办?我的代码不允许简单的“继续读取更多数据”,因为我正在使用 select() 来处理多个请求。

基本上,这是我的情况:

//This is the chunk of code ran after select(), when a socket
//has readable data
char buf[256] = { 0 };
int nbytes;

if ((nbytes = recv(i, buf, sizeof(buf) - 1, 0)) <= 0)
{   
   if (nbytes == 0)
   {   
      struct remote_address addr;

      get_peername(i, &addr);
      do_log("[Socket #%d] %s:%d disconnected", i, addr.ip, addr.port);
   }   
   else
      do_log("recv(): %s", strerror(errno));

   close(i);
   FD_CLR(i, &clients);
}   
else
{   
   buf[sizeof(buf) - 1] = 0;
   struct remote_address addr;

   get_peername(i, &addr);
   do_log("[Socket #%d] %s:%d (%d bytes): %s", i, addr.ip, addr.port, nbytes, buf);

   // split "buf" here, and process each line
   // but how to be able to get the rest of a possibly cut off line
   // in case it did not fit into the 256 byte buffer?
}

我正在考虑有一个更高范围的临时缓冲区变量(可能是 malloc()'d)来保存当前缓冲区,如果它太长而不能一次放入,但我总是如果有更好的解决方案,则对引入不必要的高范围变量感到难过:/

我感谢任何指点(除了 XKCD 的指点:))!

最佳答案

我想您需要添加另一个每个流缓冲区来保存不完整的行,直到收到后面的换行符。

关于c - 从字符串中可靠地拆分行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2421853/

相关文章:

c - 在 C 中使用 sscanf 从文件中读取多行字符串

Java UDP客户端未从服务器接收(简单客户端服务器udp代码)

python - 在 Windows 上的同一端口上运行 Python Web 服务器两次 : no "Port already in use" message

C动态分配的数组使用memset进行初始化

c++ - 为多边形轮廓绘制圆的最有效方法

java - 如何从字符串中提取和分离 double 值?

networking - 在 vCenter 上运行 Kubernetes

c - Scanf 用于两个字符串和一个 float

c - 如何启动进程并获取其输出?

java - 错误:cannot find symbol -variable