当时在写一个跨平台的程序,里面有一部分涉及到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相关推荐

  1. linux如何拿到文件的返回值,linux 下read函数返回值分析

    原文出处:http://blog.chinaunix.net/space.php?uid=20558494&do=blog&id=2803003 read函数是Linux下不带缓存的文 ...

  2. linux 函数返回string,linux 下c函数strcmp的返回值疑问?

    linux 下c函数strcmp的返回值疑问? strcmp函数解释: NAME strcmp, strncmp - compare two strings SYNOPSIS #include int ...

  3. Linux下connect函数 阻塞 与 非阻塞 问题

    一.概述 linux系统下,connect函数是阻塞的,阻塞时间的长度与系统相关.而如果把套接字设置成非阻塞,调用connect函数时会报错Operation now in progress,且err ...

  4. LINUX下poll函数用法

    LINUX下poll函数用法 文章目录 LINUX下poll函数用法 一.函数介绍 二.使用 1. 一.函数介绍 int poll(struct pollfd *fds, nfds_t nfds, i ...

  5. linux下system函数的深入理解

    这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为 ...

  6. linux下readlink函数详解

    linux下readlink函数详解 相关函数: stat, lstat, symlink 表头文件: #include <unistd.h> 定义函数:int  readlink(con ...

  7. Linux下curses函数库的详细介绍

    Linux下curses函数库的详细介绍 curses库介绍 安装 curses库函数介绍 初始化和重置函数 管理屏幕的函数 输出到屏幕 从屏幕读取 清除屏幕 移动光标 字符属性 管理键盘的函数 键盘 ...

  8. Linux下select函数实现的聊天服务器

    转载: http://blog.csdn.net/microtong/article/details/4989902 Linux下select函数实现的聊天服务器  佟强 http://blog.cs ...

  9. Linux下time函数

    Linux下time函数都在time.h头文件中. 1.头文件 和时间有关的头文件有以下几个: time.h sys/time.h sys/times.h sys/timeb.h sys/timex. ...

最新文章

  1. 【scala】 scala 条件控制 和异常处理(二)
  2. 判断是不是链接 正则_Python 正则表达式 保姆级教程,小学生都看得懂!!
  3. 转载: 8天学通MongoDB——第七天 运维技术
  4. html js css如何关联_html+css +js 选项卡
  5. java 错误码设计_JAVA端的错误码和错误信息,该设计成全局常量还是枚举值?
  6. python程序如何封装成接口_python接口自动化如何封装获取常量的类
  7. Java8————Base64
  8. 基于HTTP请求头字段 User-Agent用户环境 开发多端应用
  9. java第七章jdbc课后简答题_jsp编程基础第七章习题
  10. java简介 ppt 精,TP1java简介.ppt
  11. function fnShowMessageBox(sTitle, sMsg)弹窗
  12. php安装sphinx扩展,安装php的sphinx扩展模块
  13. 2012 国庆中秋黄金周流水帐
  14. 是男人就下100层【第二层】——帮美女更衣(2)
  15. openGL中用Assimp库加载骨骼动画
  16. 逃离北上广的“症结”
  17. 千千静听V5.6 Beta3 美化增强版
  18. 通灵学院|游戏设计研习1:人类的需求与动机★(1200字)
  19. 信用风险频发背后:11月约600亿信用债发行取消
  20. 联想H61主板升级BIOS,支持nvme硬盘

热门文章

  1. qchart 怎么点击一下 出一条线_疏通身上一条线,很多难缠病,不知不觉消失了!...
  2. pma mysql_mysql pma怎么看当前连接数
  3. 学生电脑哪个牌子好_香米哪个牌子好
  4. windows 安装nginx
  5. 进阶08 Collections实现类、Comparator比较器接口
  6. 用递归和非递归实现斐波那契数列
  7. ipv4转ipv6 在线工具_TOOLFK在线工具-在线文字转语音/语音合成mp3工具
  8. python docx 合并文档 图片_使用python抓取大量简历文档内数据(word:docx;pdf;图片等)输出表格文件...
  9. whitelist方法_Jsoup学习之Whitelist类
  10. python在多边形内随机生成点_Python随机生成均匀分布在三角形内或者任意多边形内的点...