Socket網(wǎng)絡(luò)通信
socket是應(yīng)用層與TCP/IP協(xié)議通信的中間軟件的抽象層,它是一組接口诫硕。
網(wǎng)絡(luò)中進(jìn)程通信:利用三元組(ip地址,協(xié)議越驻,端口)標(biāo)識(shí)叽掘;其中楣铁,ip地址作用于網(wǎng)絡(luò)層,協(xié)議和端口作用在傳輸層更扁。
- Socket函數(shù)
int Socket(int domain, int type, int protocol);
Socket()用于創(chuàng)建一個(gè)socket描述符盖腕,它唯一標(biāo)識(shí)一個(gè)socket.
-
domain
:
即協(xié)議域,又稱為協(xié)議族(family)浓镜,協(xié)議族決定了socket的地址類型赊堪,在通信中必須采用對(duì)應(yīng)的地址; -
type
:
指定socket類型竖哩; -
protocol
:
指定協(xié)議。
type和protocol不可以隨意組合脊僚,當(dāng)protocol為0時(shí)相叁,會(huì)自動(dòng)選擇type類型對(duì)應(yīng)的默認(rèn)協(xié)議。
- bind()函數(shù)
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
-
sockfd
:
即socket描述字辽幌,通過socket()函數(shù)創(chuàng)建的增淹,唯一標(biāo)識(shí)一個(gè)socket, bind()就是將這個(gè)描述字綁定一個(gè)名字; -
addr
:
一個(gè)const struct sockaddr* 指針乌企,指向要綁定給sockfd的協(xié)議地址虑润。這個(gè)地址結(jié)構(gòu)根據(jù)地址創(chuàng)建socket時(shí)的地址協(xié)議族的不同而不同; -
addrlen
:
對(duì)應(yīng)的時(shí)地址的長(zhǎng)度加酵。
- listen(), connect()函數(shù)
如果作為一個(gè)服務(wù)器拳喻,在調(diào)用socket(), bind()之后就會(huì)調(diào)用listen()來監(jiān)聽這個(gè)socket,如果客戶端這是調(diào)用connect()發(fā)出連接請(qǐng)求猪腕,服務(wù)器端就會(huì)接收到這個(gè)請(qǐng)求冗澈。
int listen(int sockfd, int backlog);//sockfd:要監(jiān)聽的socket描述字; backlog:相應(yīng)socket可以排隊(duì)的最大連接個(gè)數(shù)陋葡。
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);//sockfd:客戶端socket描述字亚亲; addr:服務(wù)器socket地址; addrlen:socket地址長(zhǎng)度腐缤。
socket()函數(shù)創(chuàng)建的sockey默認(rèn)為一個(gè)主動(dòng)類型捌归,listen函數(shù)將socket變?yōu)楸粍?dòng)類型的,等待客戶的連接請(qǐng)求岭粤;
客戶端通過調(diào)用connect函數(shù)來建立與TCP服務(wù)器的連接惜索。
- accept()函數(shù)
TCP的服務(wù)器一次調(diào)用socket(),bind(),listen()之后,就會(huì)監(jiān)聽指定的socket地址了绍在。TCP客戶端一次調(diào)用socket()门扇、connect()之后就向TCP服務(wù)器發(fā)送一個(gè)連接請(qǐng)求雹有。TCP服務(wù)器監(jiān)聽到這個(gè)請(qǐng)求之后,就會(huì)調(diào)用accept()函數(shù)來接受請(qǐng)求臼寄,這樣連接就建立好了霸奕。之后就可以開始網(wǎng)絡(luò)I/O操作了。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //sockfd:服務(wù)器socket描述字吉拳; addr:用于返回客戶端的協(xié)議地址质帅; addrlen:協(xié)議地址的長(zhǎng)度。
如果accept成功留攒,那么其返回值是由內(nèi)核自動(dòng)生成的一個(gè)全新的描述字煤惩,代表與返回客戶的TCP連接。
accept第一個(gè)參數(shù)為服務(wù)器的socket描述符炼邀,是服務(wù)器開始調(diào)用socket()函數(shù)生成的魄揉,稱為監(jiān)聽socket描述字,而accept函數(shù)返回的是連接的socket描述字拭宁。
- read()洛退、write()等函數(shù)
- send()、recv()等函數(shù)杰标,有···更好的發(fā)送接收函數(shù)···
- close()函數(shù)兵怯;
- socket握手 連接 釋放連接
socket中TCP的三次握手|建立連接:客戶端的connect在三次握手的第二次返回,而服務(wù)器的accept在三次握手的第三次返回腔剂;
socket的TCP的四次握手|釋放連接媒区。