Windows Socket和Linux Socket编程的区别

SOCKET在原理上应该是一样的,只是不同系统的运行机置有些不同。Socket 编程 windows到Linux代码移植遇到的问题1、一些常用函数的移植http://www.vckbase.com/document/viewdoc/?id=15862、网络socket相关程序从windows移植到linux下需要注意的1)头文件windows下winsock.h/winsock2.hlinux下sys/socket.h错误处理:errno.h其他常用函数的头文件可到命令行下用man指令查询。2)初始化windows下需要用WSAStartuplinux下不需要(很方便),直接可以使用3)关闭socketwindows下closesocket(...)linux下close(...)4)类型windows下SOCKET在linux下为int类型5)绑定地址的结构体名称相同,都是struct sockaddr、struct sockaddr_in,这两者通常转换使用;在Windows下面名称都是大写,而在Linux下为小写常用:Linux下:sockaddr_in destAddr;destAdd.sin_family=AF_INET;destAddr.sin_port=htons(2030);destAddr.sin_addr.s_addr=inet_addr("192.168.1.1");Windows下:SOCKADDR_IN destAddr;destAddr.sin_addr.S_un.S_addr=inet_addr("192.168.1.1");但结构体中成员的名称不同Windows中结构体成员struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8];}; struct sockaddr { u_short sa_family; char sa_data[14];}; struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un;}; 下面的一些宏可以使windows下的程序移植到linux下(通过类型的重新定义,使代码具有linux和windows下的移植性)[cpp] view plain  copy

#ifdef WIN32typedef int socklen_t;typedef int ssize_t;#endif#ifdef __LINUX__typedef int SOCKET;typedef unsigned char BYTE;typedef unsigned long DWORD;#define FALSE 0#define SOCKET_ERROR (-1)#endif6)获取错误码windows下getlasterror()/WSAGetLastError()linux下errno变量7)设置非阻塞windows下ioctlsocket()linux下fcntl() <fcntl.h>8)send函数最后一个参数windows下一般设置为0linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可 能会导致程序退出。9)毫秒级时间获取windows下GetTickCount()linux下gettimeofday()10)数据类型的一些转化通用的:小端到大端(网络协议使用)的转换:htonl, htons点分十进制IP和整数之间的相互转换:inet_addr()(该函数将点分十进制转为整数),inet_aton(),inet_ntoa(),inet_pton()(linux下独有  该函数可以实现相互之间的转换)使用到的头文件不相同,linux下用man命令查询。另外注意:linux下使用的套接字为伯克利套接字,因此在 select()函数的使用上(第一个参数的设置)也有区别;windows下为了与伯克利套接字匹配,第一个参数是无所谓,一般可设为0;int maxfdp是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1,不能错!3、多线程多线程: (win)process.h --〉(linux)pthread.h_beginthread --> pthread_create_endthread --> pthread_exit

(0)

相关推荐