C语言socket编程设置接收超时(Window&Linux)

本文介绍了如何在Windows和Linux下设置C语言socket编程中UDP接收的超时。在Windows上,通过调用setsockopt并设置SO_RCVTIMEO选项可以实现。而在Linux上,需要使用struct timeval结构体来设定超时时间。当超时时,recvfrom函数会返回-1。
部署运行你感兴趣的模型镜像
最近在用C写socket时,发现要对udp接收的时间进行监听,不然使用阻塞接收时将会造成一直等待。

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

#include"stdafx.h"
#include"stdio.h"
#include "winsock2.h"
#pragmacomment(lib, "ws2_32.lib") 

 设置 接收超时为  nNetTimeout
可采用如下方法:

int nNetTimeout= 2000ms;
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;
     }

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

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>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");
}
     

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值