Windows下與Linux下編寫socket程序的區別

【【Windows】】

【Windows: 頭文件的區別】

#include<winsock.h>
#include
<winsock2.h>


【Windows: 初始化的區別】

WSADATA wsaData;
WSAStartup(
0x202,&wsaData);


【Windows: 聲明Socket】 
SOCKET類型


【Windows: Socket關閉】
closesocket()


【Windows: Socket操作錯誤返回值】 
SOCKET_ERROR


【Windows: 設置socket非阻塞】

ioctlsocket(server_socket,FIONBIO,&ul);


【Windows: WSA宏】 
WSA相關的操作


【Windows: Select()函數】 
Select()函數的第一個參數無效,寫0就可以了。


【Windows: 編譯連接】
Ws2_32.lib


【Windows: 錯誤捕捉】 
WSAGetLastError() 或者 GetLastError().


【Windows: 異常處理】 
沒有對send()的異常處理,最後一個參數無效,寫0就可以了。


【Windows: sockaddr_in結構】

addr_var.sin_addr.S_un.S_addr

Winsock裏最後那個32bit的S_addr也有幾個以聯合(Union)的形式與它共享內存空間的成員變量(便於以其他方式賦值).
遇到那種得到了是4個char的IP的形式(比如127一個,0一個,0一個和1一個共四個char),WinSock可以直接用4個S_b來賦值到S_addr裏.


【【Linux】】

【Linux: 頭文件的區別】

#include <netinet/in.h> //大部分都在這兒
#include <unistd.h> // close函數在這兒
#include <sys/socket.h> // 在in.h裏已經包含了,可以省了
#include <errno.h> // 錯誤處理
#include <sys/types.h> // 系統類型定義


【Linux: 初始化的區別】 
啥都不用做

【Linux: 聲明Socket】
SOCKET類型在Linux中沒有定義,直接用int即可。


【Linux: Socket關閉】 
close()


【Linux: Socket操作錯誤返回值】 
在Linux中沒有定義,判斷socket操作是否成功可用返回值是否爲-1即可,可將SOCKET_ERROR聲明爲-1。


【Linux: 設置socket非阻塞】 
ioctlsocket在Linux中沒有定義,用fcntl替代即可,但要包含fcntl.h頭文件。

#include<fcntl.h>
fcntl(server_socket,F_SETFL, O_NONBLOCK);

 

【Linux: WSA宏】 
WSA相關的操作在Linux不必要,直接去掉即可。


【Linux: Select()函數】 
Select()函數的第一個參數必須是後幾個參數用到的socket中,值最大的數(整型)加1。


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


【Linux: 錯誤捕捉】

#include <errno.h>
extern int errno;
int geterror(){return errno;}

 

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


【Linux: sockaddr_in結構】
addr_var.sin_addr.s_addr
Linux的Socket沒有這個聯合,就是一個32bit的s_addr。
遇到那種得到了是4個char的IP的形式(比如127一個,0一個,0一個和1一個共四個char),在Linux下,可以用邊向左移位(一下8bit,共四下)邊相加的方法賦值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章