`

win32/linux下网络编程十点需要注意的地方(收藏一下)

阅读更多

书上看到的,有几点觉得还是值得注意。

1、头文件

win32: #include<winSock.h>

linux: #include<sys/socket.h>

2、关闭

win32: closeScoket(s);

linux: close(fd);

3、在NONBLOCKING模式下调用connect,大部分返回

win32: WSAEWOULDBLOCK

linux: EINPROGRESS

表示正在连接

4、scokadrr的长度单位

win32: int

linux: socklent_t

5、获取当前执行线程上的错误

win32: WSAGetLastError()

linux: errno

6、控制I/O模式函数

win32: ioctlsocket()

linux: ioctl();

7**、对于NONBLOCKING模式下调用connect后的成功判定。

win32: 调用select()时,该socket处理writefds中,并且不在exceptfds中,就表示连接成功。

linux: a连接成功时,该socket可写;b连接建立错误时,该socket即可读也可写。

解决方式是:当发现soket可写时,调用getsockopt()检测是否有错误发生。

bool foo() {

    bool ret = false;

    int err, len;

    if( getsockopt( socket, SOL_SOCKET, SO_ERROR, (void*)&err, (socklen_t*)&len ) > 0 )

    {     if( err == 0 ) ert = true;   }

    return ret;

}

8**、对已经关闭的soket调用send()

win32: 返回错误,没其他后果。

linux: 产生信号SIGPIPE,linux对该信号的默认操作是关闭进程

解决方法:预先注册SIGPIPE信号,

#include <signal.h>

void sig_pipe(int signal) { /* 处理 */ }

在程序启动时,进行注册

signal(SIGPIPE, sig_pipe);

9**、在监听socket设置了NONBLOCKING模式下,通过accept()产生的新的soket问题

win32: 会继承监听socket的属性

linux: 不会继承,必须手动设置NONBLOCKING模式,SetNonblocking(int fd);

10**、linux下,如果一个进程帮定某个port,那当进程结束时,该port仍然会被继续占用几十秒,在这段时间内尝试对该port的绑定都会返回失败。

解决方法:调用setsockopt()启用SO_REUSERADDR属性

bool foo() {

    bool ret = false;

    int opt = 1, len = sizeof(opt);

    if( setsockopt( socket, SOL_SOCKET, SO_REUSERADDR, (const void*)&opt, len) > 0 )

    {     ret = true;    }

    return ret;

}



socket相关程序从windows移植到linux下需要注意的

1。头文件

  windows下winsock.h/winsock2.h
  linux下sys/socket.h

  2。初始化

  windows下需要用WSAStartup
  linux下不需要

  3。关闭socket

  windows下closesocket(...)
  linux下close(...)

  4。类型

  windows下SOCKET
  linux下int

  5。获取错误码

  windows下getlasterror()/WSAGetLastError()
  linux下errno变量

  6。设置非阻塞

  windows下ioctlsocket()
  linux下fcntl()

  7。send函数最后一个参数

  windows下一般设置为0
  linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可  能会导致程序退出。

  8。毫秒级时间获取

  windows下GetTickCount()
  linux下gettimeofday()
分享到:
评论

相关推荐

    windows环境下32位汇编语言程序设计

    笔者从事汇编编程已经有十几年的历史了,从8086时代的DOS汇编编程开始到当前的Win32汇编编程,从一个初学者到现在能利用Win32汇编来解决大部分编程需求,中间也经过了很长时间的摸索和大量的挫折,所以笔者很清楚...

    入门学习Linux常用必会60个命令实例详解doc/txt

    不过目前大多数较新的Linux发行版本(包括红旗 Linux、中软Linux、Mandrake Linux等)都可以自动挂装文件系统,但Red Hat Linux除外。 umount 1.作用 umount命令的作用是卸载一个文件系统,它的使用权限是超级...

    Tcl_TK编程权威指南pdf

    它们提供了足够的可编程特性(变量、流程控制和过程),使你可以将现有程序组装成符合自己需要的复杂的脚本程序。Shell程序非常适用于一些日常任务的自动化处理工作。 Tcl解释器可以很容易地添加到你的应用程序中,...

    一个进程池的服务器程序

    一个进程池的服务器程序 ... 流程大概如下: 1,父进程listen,创建pipe(下面所有父子进程之间的通信都用该pipe) 2,父进程预fork n个子进程 3,各个子进程accept(listenfd),即所有子进程竞争accept请求。...

    vc++ 应用源码包_3

    win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属...

    vc++ 应用源码包_6

    win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属...

    vc++ 应用源码包_5

    win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属...

    vc++ 开发实例源码包

    win32情况下实现媒体播放。 preemptivepopupkiller C#源码,实现简单游览器。 RangeScan扫描器源代码 ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用...

    vc++ 应用源码包_1

    win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属...

    vc++ 应用源码包_2

    win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    候不点enterBtn,而是直接关闭对话框,那么此时整个程序应该结束执行,但 是事实是这样的吗?如果你此时对程序进行了改动,再次按下run 按钮,你会发 现又出现了error: collect2: ld returned 1 exit status 的错误...

    IEEE_电气工程师_数字信号处理_FORTRAN程序库-2

    在ubuntu linux中,程序使用build-essential环境编译,需要下载gfortran。 f2c是一个开源的fortran到c的转换软件,如果不想混合编程的话,可以用它。 ============================================= 这是1976年...

    grub4dos-V0.4.6a-2017-02-04更新

    执行时可以不用输入扩展名,比如输入test如果当前路径下有一个test.g4b就会自动使用。 2013-10-17 1.修改代码支持新版HOTKEY。 2013-07-10 1.insmod现在支持长文件名(以前最多11个字符,现在没有限制). 2....

    Reversing:逆向工程揭密

    3.7.2 Win32子系统 104 3.8 结构化异常处理 105 3.9 结论 107 第4章 逆向工具 109 4.1 不同的逆向方法 110 4.1.1 离线代码分析 110 4.1.2 现场代码分析 110 4.2 反汇编器——ILDasm 110 4.3 调试器 116 4.3.1 用户...

Global site tag (gtag.js) - Google Analytics