Mac OS X下的網絡編程(socket)的機制

對於socket的機制來說,應該都是差不多的
如果用C來寫的話,我給出一個簡要說明

1.1 什麼是Socket?
Socket是網絡文件描述符。在基於Socket的編程技術中,用戶不直接訪問發送和接收包的網絡接口設備,而是建立一箇中間文件描述符來處理編程接口到網絡的操作。

1.2 Socket包括哪些內容?
一個特殊的通信域,比如一個網絡連接
一個特殊的通信類型,比如流或者數據報
一個特殊的協議,比如TCP或者UDP

1.3 Unix的Socket() C函數詳細說明:
int socket(int domain, int type, int protocol)
domain的取值:
PF_UNIX  Unix IPC通信
PF_INET  IPV4通信
PF_INET6 IPV6
PF_IPX  Novell IPX
PF_NETLINK Kernel用戶接口驅動程序
PF_X25  X.25
PF_AX25
PF_ATMPVC ATM PVC
PF_APPLETALK AppleTalk協議
PF_PACKET 低級包接口
type的取值:
SOCK_STREAM 使用面向連接的通信包
SOCK_DGRAM 使用無連接的通信包
SOCK_SEQPACKET 使用有固定最大長度的面向連接的通信包
SOCK_RAW 使用原IP包
SOCK_RDM 使用不保證次序的可靠數據報
Protocol:
一般使用與type對應的默認協議,用0表示。
例如: int newsocket = socket(PF_INET, SOCK_STREAM,  0 );//使用TCP

1.4 使用面向連接的套接字
IP領域只有兩種類型: connection-oriented, connectionless
使用面向連接的套接字,服務器和客戶端需要如下通信方式:

Server   Client

socket() socket()
bind()
listen()
accept() <---- connect()
recv()   <---- send()
send()   ----> recv()
close()  <---> close()

1.5 使用無連接的套接字
SOCK_DGRAM使用UDP協議。通信方式如下:

UDP Server UDP Client

socket() socket()
bind()
recvform() <--- sendto()
sendto()   ---> recvform()
close()  close()

1.6 使用無阻塞的I/O方法

什麼是阻塞? 
比如使用recv(),如果函數接受不到數據,就會阻塞程序的繼續執行。

如何防止阻塞?
使用fcntl()函數,把套接字設置爲無阻塞模式。

int newsocket;
newsocket = socket(PF_INET, SOCK_STREAM, 0 );
fcntl( newsocket, F_SETEL, O_NONBLOCK );

以後使用recv()就不會阻塞了。

另一種方式是使用多路套接字select()

2 WinSock技術

總的說來,就是模仿Unix socket的實現。
2.1 WinSock下的函數和流程

Server  Client
WSAstartup() WSAStartup()
WSASocket() WASSocket()
bind()
listen()
WSAAccept() <-- WSAConnect()
WSARecv()   <-- WSASend()
WSASend()   --> WSARecv()
close()     <-> close()
WSACleanup() WSACleanup()

與Unix socket的最主要區別就是在最上面加了WSAStartup()函數,最後加了WSACleanup()函數。中間都是一樣的。

int WSAStartup(WORD wversion, LPWSADATA lpWSAData)
第一個參數是版本,要求2.2 還是1.1.
函數成功以後,lpWSAData指向一個結構體,包括win sock的一些信息。

WSACleanup()函數用來釋放winsocket庫,這個函數之後,再調用任何socket函數,都會出錯。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章