Linux 和 Windows Socket编程的区别

来源:互联网 发布:淘宝 论文代发 卓越 编辑:程序博客网 时间:2024/05/17 23:45

最近写一个项目,需要在Linux 和 Windows 两个主要平台编写网络Socket,找了一下没有兼容库,所以查找了一下这两个平台的Socket的一些区别,方便移植的用。


 1、头文件:

    #include <winsock.h> or #include <winsock2.h>

    #include <sys/socket.h>

  • 添加#program comment(lib,"Ws2.lib")
  • 默认windows.h文件会包含winsock.h,当你包含winsock2.h就会冲突。要解决这个问题,需要首先包含winsock2.h,然后再包括windows.h,要注意包含的顺序。

    2、socket初始化与关闭:

    Windows需要 WSAStartup(),closesocket(...)函数

    Linux不需要初始化,结束socket用close(...)

    3、类型声明:

    SOCKET

    int

  • 在Windows里将SOCKET宏定义成unsigned int

    4、错误返回码:

    windows下getlasterror()/WSAGetLastError()/SOCKET_ERROR

    linux下errno变量

  • SOCKET_ERROR=-1

    5、设置非阻塞:

    ioctlsocket(server_socket,FIONBIO,&ul);

    ioctlsocket在Linux中没有定义,用fcntl替代即可,但要包含fcntl.h头文件。

    #include <fcntl.h>

    fcntl(server_socket,F_SETFL, O_NONBLOCK);

    6、send函数最后一个参数:

    windows下一般设置为0 

    linux下最好设置为MSG_NOSIGNAL,禁止send()函数向系统发送异常消息。如果不设置,在发送出错后有可能会导致程序退出。



一、linux下的socket编程:

1、客户端执行步骤依次如下:

socket()

connect()

send()或者recv()

close()

注意的是,connect之前要填充地址结构体,IP地址转换为网络字节序,一般用inet_aton().

2、服务器端:

socket()

bind()

listen()

accpet()

recv()或者send()

close()

(ps:一般通过将send()和recv()的最后一个参数赋为0或者1来区分阻塞与非阻塞,其中0对应阻塞,1对应非阻塞)


二、windows下的网络编程:

客户端:

WSAStartup()

socket()

connect()

send()或者recv()

closesocket()

服务器端:

WSAStartup()
socket()
bind()
listen()
accpet()
send()
recv()
closesocket()


通过以上比较可以发现:linux下的网络编程与windows下采用底层的API类似,但是也有区别:

区别一:windows下需加上WSAStartup()函数

区别二:关闭socket:linux为close(),windows为closesocket()


0 0
原创粉丝点击