`

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汇编来解决大部分编程需求,中间也经过了很长时间的摸索和大量的挫折,所以笔者很清楚...

    从Windows转向Linux教程E3000基础学习.pdf

    ### 从Windows转向Linux...以上内容覆盖了从Windows转向Linux的过程中所需要掌握的基本知识点,不仅包括了操作系统本身的使用,还涉及到了软件安装、网络配置、编程开发等多个方面,为初学者提供了一个全面的学习指南。

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

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

    Windows环境下32位汇编语言程序设计(第2版)

    ### Windows环境下32位汇编语言程序设计(第2版)相关知识点 #### 一、32位汇编语言及Win32环境介绍 - **32位汇编语言**:这是一种面向机器的低级编程语言,适用于32位处理器架构。在Windows环境下,它被用来开发...

    PB 取本地Mac和IP.zip

    需要注意的是,由于权限和隐私原因,直接访问MAC地址在某些情况下可能受到限制。 通过"PB 取本地Mac和IP"这个压缩包,我们可以预期它包含了一个PowerBuilder的示例代码或者工具,演示了如何在PowerBuilder环境中...

    slickedit 2011 v16.006(win64位)和 (win32位)

    SlickEdit 2011 V16.006是一款强大的源代码编辑器,专为程序员设计,支持多种操作系统,包括Windows 64位和32位版本。这款编辑器以其高效、全面的特性在IT行业中备受青睐,是开发人员进行代码编写和调试的重要工具。...

    IP地址获取方法源代码

    在计算机网络中,IP地址(Internet Protocol Address)是标识网络设备身份的重要标识,它由32位二进制数组成,通常用点分十进制的形式表示。IP地址分为两个部分:网络部分和主机部分,用于区分不同的网络和网络内的...

    vc++ 应用源码包_6

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

    C++ Builder 简体中文版入门教程

    - 在Win32环境下开发应用程序的方法。 - **第十三章:Win32API及Registry** - Windows API的深入解析。 - 注册表操作的方法与注意事项。 - **第十四章:窗口间的应用与关系** - 窗口通信机制。 - 窗口管理与...

    获得设备的MAC地址和IP地址.doc

    2. IP地址:IP地址是一个逻辑地址,根据IPv4标准,它由32位二进制组成,通常以4组十进制数表示,每组之间用点分隔,如`192.168.1.1`。IP地址用于在互联网上标识和寻址网络上的设备,是网络层的主要通信手段。 现在...

    ip提取源码

    2. **数据包捕获**:可能需要使用如libpcap(在Linux中)或WinPcap(在Windows中)这样的库来捕获网络流量。 3. **字符串处理**:IP地址通常是文本字符串形式,所以需要了解如何在字符串中查找和解析IP模式。 4. *...

    最令PHP初学者头痛的十四个问题

    在 Win32 系统下,需要将其修改为 Windows 系统的路径,例如 `session.save_path = "c:\windows\temp"`。 #### 4. 显示错误信息 在开发环境中,可以开启 PHP 错误报告和显示错误信息的功能,方便调试。可以在 `...

    openh264-win64-2e1774ab6dc6c43debb0b5b628bdf122a391d521.zip

    - **错误恢复机制**:在网络不稳定或丢包的情况下,通过内建的错误隐藏和恢复技术保证视频流的流畅性。 - **实时性能**:优化的算法确保在低延迟环境下运行,适合实时通信应用。 - **跨平台支持**:除了Windows 64位...

    vc++ 应用源码包_3

    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附属...

Global site tag (gtag.js) - Google Analytics