Linux下setsockopt函数返回-1,errno=22
当时在写一个跨平台的程序,里面有一部分涉及到socket这一块的代码,代码如下:
int nTimeOver=1000;
#ifdef WIN32if (::setsockopt(m_OutSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR)
#elif __GNUC__if (setsockopt(m_OutSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver,sizeof(int))==-1)
#endif{
#ifdef WIN32 sprintf(errorstring, "Error socket()= %ld", ::WSAGetLastError());::closesocket(m_OutSocket);return false;
#elif __GNUC__sprintf(errorstring, "Error socket()= %d", errno);close(m_OutSocket);return false;
#endif}
乍一看没啥问题,因为我觉得socket是通用跨平台的协议,底层代码应该是一样的,协议栈甚至不需要操作系统都可以跑起来,同时也用了条件宏来判断不同平台用不同的实现,Linux与Windows上只有一些小参数差异,基本上没有区别。
后来在linux下编译setsockopt死活出错,errno被设置22,无效参数。
我寻思不对呀,Windows上都是OK的呀,后来去查阅了一些网络编程的资料发现setsockopt设置超时属性的参数是一个struct timeval类型的结构体
在sys/time.h文件下
原型为:
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
}
后来我对其进行了修改:
#ifdef WIN32int nTimeOver=1000;
#elif __GNUC__struct timeval nTimeOver={3,0};
#endif
#ifdef WIN32if (::setsockopt(m_OutSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR)
#elif __GNUC__if (setsockopt(m_OutSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver,sizeof(struct timeval))==-1)
#endif{
#ifdef WIN32 sprintf(errorstring, "Error socket()= %ld", ::WSAGetLastError());::closesocket(m_OutSocket);return false;
#elif __GNUC__sprintf(errorstring, "Error socket()= %d", errno);close(m_OutSocket);return false;
#endif}
好了正常通过无任何报错。
总结了一下,不同系统有不同的设计,如果想做跨平台就应该把两个系统上的开发都好好学习一下。
不是学好了windows觉得socket是通用的就可以把代码移植到linux上了。
Linux下setsockopt函数返回-1,errno=22相关推荐
- linux如何拿到文件的返回值,linux 下read函数返回值分析
原文出处:http://blog.chinaunix.net/space.php?uid=20558494&do=blog&id=2803003 read函数是Linux下不带缓存的文 ...
- linux 函数返回string,linux 下c函数strcmp的返回值疑问?
linux 下c函数strcmp的返回值疑问? strcmp函数解释: NAME strcmp, strncmp - compare two strings SYNOPSIS #include int ...
- Linux下connect函数 阻塞 与 非阻塞 问题
一.概述 linux系统下,connect函数是阻塞的,阻塞时间的长度与系统相关.而如果把套接字设置成非阻塞,调用connect函数时会报错Operation now in progress,且err ...
- LINUX下poll函数用法
LINUX下poll函数用法 文章目录 LINUX下poll函数用法 一.函数介绍 二.使用 1. 一.函数介绍 int poll(struct pollfd *fds, nfds_t nfds, i ...
- linux下system函数的深入理解
这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为 ...
- linux下readlink函数详解
linux下readlink函数详解 相关函数: stat, lstat, symlink 表头文件: #include <unistd.h> 定义函数:int readlink(con ...
- Linux下curses函数库的详细介绍
Linux下curses函数库的详细介绍 curses库介绍 安装 curses库函数介绍 初始化和重置函数 管理屏幕的函数 输出到屏幕 从屏幕读取 清除屏幕 移动光标 字符属性 管理键盘的函数 键盘 ...
- Linux下select函数实现的聊天服务器
转载: http://blog.csdn.net/microtong/article/details/4989902 Linux下select函数实现的聊天服务器 佟强 http://blog.cs ...
- Linux下time函数
Linux下time函数都在time.h头文件中. 1.头文件 和时间有关的头文件有以下几个: time.h sys/time.h sys/times.h sys/timeb.h sys/timex. ...
最新文章
- 【scala】 scala 条件控制 和异常处理(二)
- 判断是不是链接 正则_Python 正则表达式 保姆级教程,小学生都看得懂!!
- 转载: 8天学通MongoDB——第七天 运维技术
- html js css如何关联_html+css +js 选项卡
- java 错误码设计_JAVA端的错误码和错误信息,该设计成全局常量还是枚举值?
- python程序如何封装成接口_python接口自动化如何封装获取常量的类
- Java8————Base64
- 基于HTTP请求头字段 User-Agent用户环境 开发多端应用
- java第七章jdbc课后简答题_jsp编程基础第七章习题
- java简介 ppt 精,TP1java简介.ppt
- function fnShowMessageBox(sTitle, sMsg)弹窗
- php安装sphinx扩展,安装php的sphinx扩展模块
- 2012 国庆中秋黄金周流水帐
- 是男人就下100层【第二层】——帮美女更衣(2)
- openGL中用Assimp库加载骨骼动画
- 逃离北上广的“症结”
- 千千静听V5.6 Beta3 美化增强版
- 通灵学院|游戏设计研习1:人类的需求与动机★(1200字)
- 信用风险频发背后:11月约600亿信用债发行取消
- 联想H61主板升级BIOS,支持nvme硬盘
热门文章
- qchart 怎么点击一下 出一条线_疏通身上一条线,很多难缠病,不知不觉消失了!...
- pma mysql_mysql pma怎么看当前连接数
- 学生电脑哪个牌子好_香米哪个牌子好
- windows 安装nginx
- 进阶08 Collections实现类、Comparator比较器接口
- 用递归和非递归实现斐波那契数列
- ipv4转ipv6 在线工具_TOOLFK在线工具-在线文字转语音/语音合成mp3工具
- python docx 合并文档 图片_使用python抓取大量简历文档内数据(word:docx;pdf;图片等)输出表格文件...
- whitelist方法_Jsoup学习之Whitelist类
- python在多边形内随机生成点_Python随机生成均匀分布在三角形内或者任意多边形内的点...