socket接收數(shù)據(jù)時通過監(jiān)聽來防止無數(shù)據(jù)接收造成的阻塞等待
關鍵字:c++ dll activiz socket通信
參考鏈接socket C編程設置接收超時(Windows & Linux)_chenyulancn的專欄-CSDN博客
背景:編寫一個c#界面程序禽车,其中包含一個激光雷達的顯示模塊唤锉。該模塊包含激光雷達數(shù)據(jù)接收/解析/顯示功能。該模塊采用c++編寫肠虽,并編譯成一個dll庫供c#主程序進行調(diào)用旁舰。接受雷達數(shù)據(jù)的功能采用socket通信進行實現(xiàn)母蛛,要對udp接收時間進行監(jiān)聽械巡,設置一個timeout,否則造成該部分陷入無止境的等待(即阻塞接收:當進程要接受的內(nèi)容沒有就緒時官还,需要等待而不能繼續(xù)執(zhí)行的一種數(shù)據(jù)接收方式)芹橡。
在Windows下似乎操作比較簡單,直接調(diào)用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望伦;//一般接收數(shù)據(jù)都在一個while(true)循環(huán)中進行林说,因此當判定一段時間無數(shù)據(jù)接收時,則使用break跳出該while循環(huán)屯伞。進入后續(xù)流程腿箩。
}
設置接收超時成功后,若超時愕掏,返回值為ret =-1
補充linux的實現(xiàn)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>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");
}