Socket程式從windows移植到linux下

2021-05-09 20:16:42 字數 1422 閱讀 8626

1)標頭檔案

windows下winsock.h或winsock2.h

linux下netinet/in.h(大部分都在這兒),unistd.h(close函式在這兒),sys/socket.h(在in.h裡已經包含了,可以省了)

2)初始化

windows下需要用wsastartup啟動ws2_32.lib,並且要用#pragma comment(lib,"ws2_32")來告知編譯器鏈結該lib。

linux下不需要

3)關閉socket

windows下closesocket(...)

linux下close(...)

4)型別

windows下socket

linux下int(我喜歡用long,這樣保證是4byte,因為-1我總喜歡寫成0xffff)

5)獲取錯誤碼

windows下getlasterror()/wsagetlasterror()

linux下,未能成功執行的socket操作會返回-1;如果包含了errno.h,就會設定errno變數

6)設定非阻塞

windows下ioctlsocket()

linux下fcntl(),需要標頭檔案fcntl.h

7)send函式最後乙個引數

windows下一般設定為0

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

8)毫秒級時間獲取

windows下gettickcount()

linux下gettimeofday()

9)多執行緒

windows下包含process.h,使用_beginthread和_endthread

linux下包含pthread.h,使用pthread_create和pthread_exit

10)用ip定義乙個位址(sockaddr_in的結構的區別)

windows下addr_var.sin_addr.s_un.s_addr

linux下addr_var.sin_addr.s_addr

而且winsock裡最後那個32bit的s_addr也有幾個以聯合(union)的形式與它共享記憶體空間的成員變數(便於以其他方式賦值),而linux的socket沒有這個聯合,就是乙個32bit的s_addr。遇到那種得到了是4個char的ip的形式(比如127乙個,0乙個,0乙個和1乙個共四個char),winsock可以直接用4個s_b來賦值到s_addr裡,而在linux下,可以用邊向左移位(一下8bit,共四下)邊相加的方法賦值。

11)異常處理

linux下當連線斷開,還發資料的時候,不僅send()的返回值會有反映,而且還會像系統傳送乙個異常訊息,如果不作處理,系統會出brokepipe,程式會退出。為此,send()函式的最後乙個引數可以設msg_nosignal,禁止send()函式向系統傳送異常訊息。

linux下socket和window下區別

socket相關程式從windows移植到linux下需要注意的 1 標頭檔案 windows下winsock.h winsock2.h linux下sys socket.h 錯誤處理 errno.h 2 初始化 windows下需要用wsastartup linux下不需要 3 關閉socket ...

window下socket實現TCP伺服器

伺服器 1.初始化 wsastartup 2.建立socket s socket 3.繫結埠 ret bind 4.監聽 ret listen 5.接收客戶端的連線請求 s new accept 三次握手發生在這個過程 6.收發資料 ret recv 阻塞模式,記憶體不夠存放傳送的資訊時,則阻塞se...

socket程式異常終止

最近在做伺服器的時候,碰到了程式異常終止的問題,困擾了我近乙個星期的時間 排除了很多重可能性,終於找到原因了,記錄下,以免忘記。當server端關閉乙個socket連線時,如果client端繼續傳送資料,系統會發出乙個sigpipe訊號給程序,通知程序這個連線已經斷開,不應該再傳送資料。而linux...