简单介绍下情况:
目前需要前后台数据传输。前台用VxWorks,后台Windows。选择了Socket通讯接口以UDP协议进行通讯。即:socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP)。绑定后直接用recvfrom()函数开始接收数据。因为UDP是无连接的,所以省略了listen()和accept()的步骤。前后台都是创建套接字句柄并绑定以后直接用recvfrom()和sendto()收发数据。现在的问题是:在调用recvfrom()以后,我如何知道有消息进来?我开始的想法是判断recvfrom()返回值,因为只要recvfrom()接收到了信息就返回接收到的字节数。如果没有收到消息,他会阻塞自己,直到有消息到来为止。那么我设置了一个死循环来接收和处理消息:
while(1)
{
if (recvfrom() != 0)
{
/*读消息缓冲区的数据*/
/*处理消息*/
}
}
这样又出来一个问题:当我在处理上一条消息的时候,如果又下来一个消息,recvfrom()能接收到这个消息吗?因为这时候循环还没有返回到recvfrom()的调用点上。是否应该考虑添加一个进程专业收消息?
有两种方式,一种查询方式,一种阻塞方式。通过setsockopt设置。
当在处理上一条消息的时候,如果又下来一个消息,会存储在缓冲区。只有处理完成,才能返回到recvfrom()。
如果处理时间较长,而接收报文频繁,这样操作可能丢失报文。最好能进行缓冲处理。
如果处理时间不是很长的话,可以顺利进行下一次接收,但是如果处理过程很长或者中间可能会发生阻塞的话,建议用多任务处理或使用消息队列处理。