C语言socket编程设置接收超时(Window&Linux)
2014-01-10 17:16
886 查看
最近在用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型将没有效果。
参考/article/9647444.html
一文后发现,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");
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>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型将没有效果。
参考/article/9647444.html
一文后发现,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");
}
相关文章推荐
- Centos yum 安装 ipython
- 新安装linux后的几个操作及命令(df,du)
- CentOS LVS安装配置
- CentOS4.5下LVS方案
- linux LVS (keepalived+ipvsadm)负载均衡搭建
- Linux共享内存
- [Linux] netstat命令详解
- 回顾总结64位CentOs下安装QT遇到的问题和解决方法
- [Linux] 系统服务与daemon
- linux基础-文本编辑、解压缩、软件安装卸载(实用)
- linux内存清理和swap内存释放办法
- Linux下diff,Patch的应用和制作方法介绍
- linux time 和 date 函数
- linux nand flash常用命令
- Linux那些事儿之我是SCSI硬盘(2)依然probe
- Linux命令实践:特殊Linux命令补充
- NIC bonding on Redhat/CentOS 6
- Linux 修改MySQL编码格式
- linux下WIFI的AP搜索及连接方法
- Netfilter