socket在linux和windows下的差异

来源:互联网 发布:雷锋的故事动画片知乎 编辑:程序博客网 时间:2024/05/21 21:19

linux和windows下的socket都源自伯克利套接字,所以其在整体上是大致相同的,只不过在一些细节上存在一定的区别。对于一些需要平台兼容的处理,能够了解这些差异是非常有必要的。

linux和windows中的socket的差异

  1. 包含的头文件不同

    linux –> 头文件:sys/socket.h 错误处理:errno.h
    windows –> winsock.h/winsock2.h, 错误信息一般是通过WSAGetLastError获取。

  2. 初始化方式不同

    linux –> linux下一切皆是文件,所以不需要特殊的初始化操作
    windows –> windows下启动时需要用WSAStartup(),退出时需要WSACleanup( )

  3. socket关闭的方式不同

    linux –> close(socketfd)
    windows –> closesocket(socketfd)

  4. socket类型不同

    linux –> int类型
    windows –> SOCKET 类型

  5. 获取错误码的方式不同

    windows –> WSAGetLastError()
    linux –> 错误信息保存在全局的errno变量

    extern int errno;
    int geterror(){return errno;}

  6. 设置阻塞模式的方式不同

    windows: –> ioctlsocket(server_socket,FIONBIO,&ul); int ul = 1
    linux –> fcntl(server_socket,F_SETFL, O_NONBLOCK);

  7. send函数最后一个参数

    windows –> 一般设置为0
    linux –> 必须是后几个参数用到的socket中,值最大的数(整型)加1(另一种说法是设置为MSG_NOSIGNAL)

  8. select函数的第一个参数

    windows –>
    int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,const struct timeval* timeout);
    nfds在windows其实是没有意义的,主要是为了兼容其他版本
    linux –>
    int select(int maxfd,fd_set*readfds,fd_set* writefds,fd_set*exceptfds,const struct timeval*timeout);
    maxfd,文件描述符的范围,比待检测的最大文件描述符大1

  9. 毫秒级时间获取
    windows –> GetTickCount()
    linux –> gettimeofday()

  10. 编译链接的不同
    windows –> 需要链接ws2_32.lib
    linux –> 连接是使用参数:-lstdc
    运行时需要libstdc++.so.5,可在/usr/lib目录中创建一个链接。

  11. Socket操作错误返回值

    windows –> SOCKET_ERROR ?
    linux –> SOCKET_ERROR ?

  12. send异常处理

    windows –> windows下没有对send()的异常处理,最后一个参数无效,写0就可以了。
    linux –> 当连接断开,还发数据的时候,不仅send()的返回值会有反映,而且还会像系统发送一个异常消息,如果不作处理,系统会出BrokePipe,程序会退 出。为此,send()函数的最后一个参数可以设置MSG_NOSIGNAL,禁止send()函数向系统发送异常消息。

原创粉丝点击