2018-10-25

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í)地址的長度。
  • 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地址長度。
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é)議地址的長度。

如果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的四次握手|釋放連接。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容