Socket 編程 windows到Linux代碼移植遇到的問題
1、壹些常用函數的移植
2、網絡
socket相關程序從windows移植到linux下需要註意的
1)頭文件
windows下winsock.h/winsock2.h
linux下sys/socket.h
錯誤處理:errno.h
其他常用函數的頭文件可到命令行下用man指令查詢。
2)初始化
windows下需要用WSAStartup
linux下不需要(很方便),直接可以使用
3)關閉socket
windows下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 plaincopy
#ifdef WIN32
typedef 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)
#endif
[cpp] view plaincopy
#ifdef WIN32
typedef 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)
#endif
6)獲取錯誤碼
windows下getlasterror()/WSAGetLastError()
linux下errno變量
7)設置非阻塞
windows下ioctlsocket()
linux下fcntl() <fcntl.h>
8)send函數最後壹個參數
windows下壹般設置為0
linux下最好設置為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