對於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函數,都會出錯。
Mac OS X下的網絡編程(socket)的機制
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
Mac OS X 使用.pcf文件配置CiscoVPN
Super明
2018-08-27 19:55:03
Mac OS 連內外網
DoubleCui
2018-08-27 18:13:02
Mac OX 下方便的微信語音,圖片,視頻等導出方式
DoubleCui
2018-08-27 18:13:01
MAC軟件下載/ SVN_CoreStone/
aofeilin
2018-08-27 17:29:29
symbol(s) not found for architecture x86_64 ---QT\FFMPEG
wastedsoul
2018-08-27 14:54:01
AndroidStudio結合JNI使用JrtpLib動態庫(一)
wastedsoul
2018-08-27 14:53:58
MAC下iterm2下命令行快捷鍵
光速跑者21
2018-08-27 12:25:08
MAC下安裝JDK並配置環境(全)
我079
2018-08-27 11:56:54
記錄一下mac 命令行使用
三良
2018-08-27 07:16:42
802.11中的幀間間隔(SIFS/PIFS/DIFS)
fuguangchao
2018-08-26 22:42:43
我在mac下使用mysql遇到的問題
grimraider
2018-08-26 20:01:25
MAC AppStore下載失敗,請到已購買頁面重新下載
_闲花_
2018-08-26 18:23:46
關於MAC用戶名目錄下找不到Library(資源庫)
_闲花_
2018-08-26 18:23:35
Mac OSX 安裝Docker
problc
2018-08-26 18:20:40