socket在windows下和linux下的區別


1)頭文件 
windows下winsock.h/winsock2.h 
linux下sys/socket.h    錯誤處理:errno.h

2)初始化 
windows下需要用WSAStartup

WSADATA wsaData;

     err = WSAStartup(0x202,&wsaData);  

    if ( err != 0 )
    {
          return 0;
    }
   else if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )   //檢測是否支持這個版本的socket
    {
          WSACleanup( );
        return 0;
    }

對應的退出清理用WSACleanup( );
linux下不需要

3)關閉socket 
windows下closesocket(...) 
linux下close(...)

4)socket類型 
windows下SOCKET 
linux下int

5)獲取錯誤碼 
windows下WSAGetLastError()

linux下errno變量

extern int errno;
int geterror(){return errno;}

6)設置非阻塞 
windows下ioctlsocket(server_socket,FIONBIO,&ul);     int ul = 1
linux下fcntl(server_socket,F_SETFL, O_NONBLOCK);    <fcntl.h>


7)send函數最后一個參數 
windows下一般設置為0 
linux下必須是后幾個參數用到的socket中,值最大的數(整型)加1 (另一種說法是設置為MSG_NOSIGNAL)


8)毫秒級時間獲取 
windows下GetTickCount() 
linux下gettimeofday()

9)編譯連接

windows下ws2_32.lib
linux下

連接是使用參數:-lstdc
運行時需要libstdc++.so.5,可在/usr/lib目錄中創建一個鏈接。

10)Socket操作錯誤返回值

都為SOCKET_ERROR,他的值是-1

11)異常處理

windows下沒有對send()的異常處理,最后一個參數無效,寫0就可以了。

linux下當連接斷開,還發數據的時候,不僅send()的返回值會有反映,而且還會像系統發送一個異常消息,如果不作處理,系統會出BrokePipe,程序會退出。為此,send()函數的最后一個參數可以設置MSG_NOSIGNAL,禁止send()函數向系統發送異常消息。

12)WSA宏

windows下WSA相關的操作

linux下WSA相關的操作在Linux不必要,直接去掉即可


13)多線程 
多線程: (win)process.h --〉(linux)pthread.h 
_beginthread --> pthread_create 
_endthread --> pthread_exit


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM