2020-11-16

socket接收数据时通过监听来防止无数据接收造成的阻塞等待

关键字:c++ dll activiz socket通信

参考链接socket C编程设置接收超时(Windows & Linux)_chenyulancn的专栏-CSDN博客

背景:编写一个c#界面程序,其中包含一个激光雷达的显示模块。该模块包含激光雷达数据接收/解析/显示功能。该模块采用c++编写,并编译成一个dll库供c#主程序进行调用。接受雷达数据的功能采用socket通信进行实现,要对udp接收时间进行监听,设置一个timeout,否则造成该部分陷入无止境的等待(即阻塞接收:当进程要接受的内容没有就绪时,需要等待而不能继续执行的一种数据接收方式)。

在Windows下似乎操作比较简单,直接调用winsock2.h和ws2_32.lib编程

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Windows<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#include"stdafx.h"

#include"stdio.h"

#include "winsock2.h"

#pragmacomment(lib, "ws2_32.lib")

设置接收超时为nNetTimeout

可采用如下方法:

intnNetTimeout=2000;

if (SOCKET_ERROR ==setsockopt(serSocket,SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout,sizeof(int)))

{

printf("Set Ser_RecTIMEO error !\r\n");

}

int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr*)&remoteAddr, &nAddrLen);if(ret<0)

{

printf("recv timeout! %d\n",ret);//ret = -1

//continue;

break;//一般接收数据都在一个while(true)循环中进行,因此当判定一段时间无数据接收时,则使用break跳出该while循环。进入后续流程。

}

设置接收超时成功后,若超时,返回值为ret =-1

补充linux的实现

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Linux<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

而Linux下则不太一样,timeout若仍采用int型将没有效果。

linux下应将timeout类型改成struct timeval

注意符号:

struct timevaltimeout={4,0};

//即timeout={4,0};或者timeout.tv_sec=4;timeout.tv_usec=0;

//设置接收超时

//setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));

setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(structtimeval));

//同样接收超时后接收返回-1

if((rec_length=recvfrom(sockfd,recbuf,MAXDATASIZE,0,(structsockaddr *)&peer,&addrlen))== -1){

printf("recvtimeout!\n");

}

你可能感兴趣的:(2020-11-16)