C从套接字读取直到换行

时间:2015-01-30 05:52:26

标签: c sockets networking tcp network-programming

我正在尝试编写一个TCP服务器,只要收到保证以“\ n”结尾的消息,就会响应客户端。我看过像this one这样的其他帖子似乎在查看每个单独的字符,看它是否是一个新行,但这似乎违背了将数据读入缓冲区的目的。有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

另一种方法是自己处理缓冲,例如:

std::string nextCommand;

while(1)
{
   char buf[1024];
   int numBytesRead = recv(mySocket, buf, sizeof(buf), 0);
   if (numBytesRead > 0)
   {
      for (int i=0; i<numBytesRead; i++)
      {
         char c = buf[i];
         if (c == '\n')
         {
            if (nextCommand.length() > 0)
            {
               printf("Next command is [%s]\n", nextCommand.c_str());
               nextCommand = "";
            }
         }
         else nextCommand += c;
      }
   }
   else
   {
      printf("Socket closed or socket error!\n");
      break;
   }
}

(请注意,为了简单起见,我使用C ++ std :: string来保存我的示例代码中的数据;因为您使用的是C,所以您需要找到另一种方法存储传入的字符串。如果你能保证最大的命令长度,你可以使用固定大小的字符数组和计数器变量;如果你需要处理无限的命令大小,那么你需要提出一些一种可以根据需要增长的数据结构,例如通过使用realloc()或使用链接列表等动​​态分配更大的缓冲区