socket C编程设置接收超时(Windows & Linux)

转载 2016年08月30日 17:49:14
最近在用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");
}

linux编程中的超时设置

http://blog.csdn.net/simba888888/article/details/9073963 http://blog.chinaunix.net/xmlrpc.php?r=blo...
  • zdf511391565
  • zdf511391565
  • 2015年11月26日 10:51
  • 1495

关于recvfrom接收超时

recvfrom,这方法如果不特意设置,默认
  • u010951692
  • u010951692
  • 2014年08月18日 11:07
  • 6195

recvfrom设置超时

struct timeval tv; int ret; tv.tv_sec = 10; tv.tv_usec = 0; if (setsockopt(s, SOL_SOCKET, SO_RCVTIME...
  • mingcz
  • mingcz
  • 2014年03月09日 01:54
  • 2555

recv、send函数windows和linux下超时设置

在socket通讯中,如果不设置超时时间的话,recv和send函数都会一直无限阻塞在那等待接受数据,为了防止出现这种情况,需要设置超时时间,windows下是这样设置超时时间 int recvT...
  • gufeijunchi
  • gufeijunchi
  • 2014年11月27日 14:08
  • 2801

Linux下的socket编程实践(五)设置套接字I/O超时的方案

(一)使用alarm 函数设置超时 #include unsigned int alarm(unsigned int seconds); 它的主要功能是设置信号传送闹钟。信号SIGALRM在...
  • NK_test
  • NK_test
  • 2015年10月11日 19:57
  • 3281

从另一个线程将recvfrom从阻塞状态唤醒

UDP的多线程程序,一般开一个线程循环调用recvfrom接收消息,当程序中止的时候,如果这个线程阻塞在recvfrom调用,并且没有消息到达,则这个线程无法终止,造成资源泄露等问题。 这里终止这个...
  • OracleJ
  • OracleJ
  • 2012年02月28日 12:51
  • 1607

C socket: 关于connect超时设置

使用阻塞的socket, 可以设置读写超时, struct timeval tv_timeout; tv_timeout.tv_sec = 60; tv_timeout.tv_usec = 0; i...
  • qianshen88
  • qianshen88
  • 2013年09月25日 18:33
  • 2139

Socket 关于设置Socket连接超时时间

Socket 关于设置Socket连接超时时间 博客分类:  网络编程 tcpsocket崔素强jdk超时  做网络编程的人对setSoTimeout方法一定很熟悉,都知道...
  • jiafu1115
  • jiafu1115
  • 2014年10月10日 16:33
  • 15142

Socket 关于设置Socket连接超时时间

做网络编程的人对setSoTimeout方法一定很熟悉,都知道是设置连接的超时时间! 但是我在网上找资料时发现很多人把这个超时时间理解成了链路的超时时间!我看了一下JDK 关于这个方法的说明,其实根本...
  • u010152707
  • u010152707
  • 2013年11月11日 17:32
  • 2470

socket 设置阻塞和超时

socket 设置阻塞和超时 . 分类: IOS socket2013-01-09 22:29 1669人阅读 评论(0) 收藏 举报 目录(?)[-] SETSOC...
  • ee230
  • ee230
  • 2015年09月17日 16:50
  • 3954
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:socket C编程设置接收超时(Windows & Linux)
举报原因:
原因补充:

(最多只允许输入30个字)