Socket相關程式:從Windows移植到Linux

iteye_21202發表於2013-04-24

socket相關程式從windows移植到linux下需要注意的

<wbr>Linux Socket程式設計中的shutdown和close<br> 1,只要TCP棧的讀緩衝裡還有未讀取(read)資料,則呼叫close時會直接向對端傳送RST。<br> 2,shutdown與socket描述符沒有關係,即使呼叫shutdown(fd, SHUT_RDWR)也不會關閉fd,最終還需close(fd)。<br> 3,可以認為shutdown(fd, SHUT_RD)是空操作,因為shutdown後還可以繼續從該socket讀取資料,這點也許還需要進一步證實。<br> 4,在已傳送FIN包後write該socket描述符會引發EPIPE/SIGPIPE。<br> 5,當有多個socket描述符指向同一socket物件時,呼叫close時首先會遞減該物件的引用計數,計數為0時才會傳送FIN包結束TCP連線。shutdown不同,只要以SHUT_WR/SHUT_RDWR方式呼叫即傳送FIN包。<br> 6,SO_LINGER與close,當SO_LINGER選項開啟但超時值為0時,呼叫close直接傳送RST(這樣可以避免進入TIME_WAIT狀態,但破壞了TCP協議的正常工作方式),SO_LINGER對shutdown無影響。<br> 7,TCP連線上出現RST與隨後可能的TIME_WAIT狀態沒有直接關係,主動發FIN包方必然會進入TIME_WAIT狀態,除非不傳送FIN而直接以傳送RST結束連線。<br></wbr>

<wbr></wbr>

1)標頭檔案

windows下winsock.h/winsock2.h

linux下sys/socket.h

錯誤處理:errno.h

<wbr></wbr>

2)初始化

windows下需要用WSAStartup

linux下不需要

<wbr></wbr>

3)關閉socket

windows下closesocket(...)

linux下close(...)

<wbr></wbr>

4)型別

windows下SOCKET

linux下int

如我用到的一些巨集:

#ifdef WIN32

typedef int socklen_t;

typedef int ssize_t;

#endif

<wbr></wbr>

#ifdef __LINUX__

typedef int SOCKET;

typedef unsigned char BYTE;

typedef unsigned long DWORD;

#define FALSE 0

#define SOCKET_ERROR (-1)

#endif

<wbr></wbr>

5)獲取錯誤碼

windows下getlasterror()/WSAGetLastError()

linux下errno變數

<wbr></wbr>

6)設定非阻塞

windows下ioctlsocket()

linux下fcntl()

<wbr></wbr>

7)send函式最後一個引數

windows下一般設定為0

linux下最好設定為MSG_NOSIGNAL,如果不設定,在傳送出錯後有可能會導致程式退出。

<wbr></wbr>

8)毫秒級時間獲取

windows下GetTickCount()

linux下gettimeofday()

<wbr></wbr>

多執行緒

多執行緒: (win)process.h --〉(linux)pthread.h

_beginthread --> pthread_create

_endthread --> pthread_exit

相關文章