繁体   English   中英

如何正确使用recv()sys调用

[英]how to correctly use recv() sys call

我正在使用Linux下的Berkely SOCKET API编写TCP服务器的过程。 现在,客户端具有一组规范,并且客户端发送的每个消息都是基于这些规范的,即,从客户端发送的消息对应于规范指定的许多结构之一。 现在的场景是服务器不知道客户端将在什么时间发送哪个消息。 收到消息后,我们就可以弄清楚它是什么,但是在此之前是不可能的。 客户端发送的消息的长度是可变的,因此我们无法预先知道要获得什么消息。 为了解决这个问题,我使用了以下方法:

const char *buf[4096] = { 0 };
          if ( recv (connected, buf, 4096, 0) == -1)
             {
               printf ("Error in recvng message\n");
               exit (-1);
             }

那就是我使用大小为4096的默认缓冲区(来自客户端的消息不能大于此大小)。 在该缓冲区中接收,然后再检查消息类型并采取以下相应操作:

struct ofp_header *oph;
oph=(struct ofp_header *)buf;
switch (oph->type)
{
case example_pkt:
handle_example_pkt();
break;
}

这可以正常工作,但我只是想确认这是一种适当的方法,还是还有其他方法可以比这更好的方法。 所有帮助,不胜感激。

谢谢。

TCP是基于流的。 这意味着,如果您使用大于消息的缓冲区,则可能还会收到下一条消息的一部分。

这意味着您将需要知道消息的大小并将任何其他数据合并到下一条消息中。 有两种明显的方法可以做到这一点:

  1. 修改协议以将每个消息的大小作为消息的前几个字节发送。 首先读取大小,然后仅读取那么多字节。

  2. 由于您知道每个消息的大小,因此请跟踪读取的字节数。 处理缓冲区中的第一条消息,然后从缓冲区中的剩余字节中减去该消息的大小。 继续重复此过程,直到您A.没有足够的字节来标识消息类型,或者B.没有足够的字节来存储所检测类型的消息。 保存所有剩余字节,然后再次调用recv以读取更多数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM