admin管理员组文章数量:1613624
linux和windows下的socket都源自伯克利套接字,所以其在整体上是大致相同的,只不过在一些细节上存在一定的区别。对于一些需要平台兼容的处理,能够了解这些差异是非常有必要的。
linux和windows中的socket的差异
包含的头文件不同
linux –> 头文件:sys/socket.h 错误处理:errno.h
windows –> winsock.h/winsock2.h, 错误信息一般是通过WSAGetLastError获取。初始化方式不同
linux –> linux下一切皆是文件,所以不需要特殊的初始化操作
windows –> windows下启动时需要用WSAStartup(),退出时需要WSACleanup( )socket关闭的方式不同
linux –> close(socketfd)
windows –> closesocket(socketfd)socket类型不同
linux –> int类型
windows –> SOCKET 类型获取错误码的方式不同
windows –> WSAGetLastError()
linux –> 错误信息保存在全局的errno变量extern int errno;
int geterror(){return errno;}设置阻塞模式的方式不同
windows: –> ioctlsocket(server_socket,FIONBIO,&ul); int ul = 1
linux –> fcntl(server_socket,F_SETFL, O_NONBLOCK);send函数最后一个参数
windows –> 一般设置为0
linux –> 必须是后几个参数用到的socket中,值最大的数(整型)加1(另一种说法是设置为MSG_NOSIGNAL)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毫秒级时间获取
windows –> GetTickCount()
linux –> gettimeofday()编译链接的不同
windows –> 需要链接ws2_32.lib
linux –> 连接是使用参数:-lstdc
运行时需要libstdc++.so.5,可在/usr/lib目录中创建一个链接。Socket操作错误返回值
windows –> SOCKET_ERROR ?
linux –> SOCKET_ERROR ?send异常处理
windows –> windows下没有对send()的异常处理,最后一个参数无效,写0就可以了。
linux –> 当连接断开,还发数据的时候,不仅send()的返回值会有反映,而且还会像系统发送一个异常消息,如果不作处理,系统会出BrokePipe,程序会退 出。为此,send()函数的最后一个参数可以设置MSG_NOSIGNAL,禁止send()函数向系统发送异常消息。
版权声明:本文标题:socket在linux和windows下的差异 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728656720a1168242.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论