Socket APT
套接字為客戶和服務(wù)提供應(yīng)用進(jìn)程間通信的抽象機(jī)制
一臺主機(jī)在應(yīng)用層會有多個進(jìn)程,如何連接?
給套接字綁定端口
標(biāo)售通信端點(diǎn)(對外):IP+端口、
操作系統(tǒng)/進(jìn)程如何管理套接字(對內(nèi)):套接字描述符(socket descriptior)
Socket APT函數(shù)(WinSock)
WSAStratup:
使用Socket的應(yīng)用程序在使用Socket之前必須首先調(diào)用該函數(shù)
兩個參數(shù):
1.第一個參數(shù)知名程序請求使用的WinSock版本,其中高字節(jié)指明副版本,地位字節(jié)指明主版本
十六進(jìn)制整數(shù),如0x102表示2.1版
2.第二個參數(shù)返回實(shí)際的WinSock的版本信息
指向WSADATA結(jié)構(gòu)的指針
SOCK_DGRAM報(bào)文套接字
SOCK_STREAM流式套接字
SOCK_RAW原始套接字(需要高級權(quán)限才能使用)
TCP:可靠,面向連接,字節(jié)流傳輸,點(diǎn)對點(diǎn)
UDP:不可靠,無連接 數(shù)據(jù)報(bào)傳輸
bind函數(shù) :綁定套接字的本地端點(diǎn)地址
IP地址+端口號
參數(shù):
套接字描述符(sd)
端點(diǎn)地址(localaddr)
結(jié)構(gòu)sockaddr_in
客戶端一般不需要綁定端口
服務(wù)端需要要綁定端口
Q:一個服務(wù)器主機(jī)可能有多個IP地址,從不同網(wǎng)絡(luò)訪問可能會產(chǎn)生問題,,如何解決?
服務(wù)器應(yīng)該綁定地址通配符:INADDR_ANY,這樣只要在主機(jī)上有效的IP地址都成立
listen函數(shù) int listen(sd,queuesize);
作用:
使位于服務(wù)器端的流套接字處于監(jiān)聽狀態(tài)
僅服務(wù)端調(diào)用
僅用于面向連接的流式套接字
queuesize:設(shè)置連接請求隊(duì)列的大?。╭ueuesize)
返回值:0成功,SOCKET_ERRPOR:失敗
connect函數(shù):
connect(sd,saddr,saddrlen)
客戶端程序調(diào)用connect函數(shù)來使客戶端套接字(sd)和特定的計(jì)算機(jī)的特定端口(saddr)的套接字進(jìn)行連接
connect函數(shù)僅用于客戶端
TCP/UDP:
TCP客戶端:向指定的saddr發(fā)送請求,建立TCP連接
UDP客戶端:僅指定服務(wù)器端點(diǎn)地址
accept函數(shù):
newsock=accpet(sd,caddr,caddrlen);
服務(wù)器程序調(diào)用accept函數(shù)從處于監(jiān)聽狀態(tài)的流套接字sd的客戶端連接
請求隊(duì)列中取出排在最前的一個客戶請求,并且創(chuàng)建一個新的套接字來
和客戶套接字創(chuàng)建連接通道
僅用于TCP套接字,僅用于服務(wù)器
真正為客戶服務(wù),連接的是新的套接字
為了實(shí)現(xiàn)并發(fā)的tcp服務(wù)器
send,sendto函數(shù):用于發(fā)送數(shù)據(jù)
recv ,recvfrom:用于接受數(shù)據(jù)