Linux網路編程4——個人總結

來源:互聯網
上載者:User

標籤:style   blog   color   os   使用   io   ar   div   log   

TCP與UDP通訊流程

TCP通訊的基本步驟如下:

服務端:socket---bind---listen---while(1){---accept---recv---send---close---}------close

用戶端:socket------------------------------connect---send---recv-----------------close

UDP通訊的基本步驟如下:

服務端:socket---bind---recvfrom---sendto----close

用戶端:socket----------sendto----recvfrom---close

函數原型 TCP
TCP#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>#include <stdio.h>#include <stdlib.h>server:int socket(int domain, int type, int protocol);int bind(int fd_server, struct sockaddr *addr_server, int addrlen); /* 綁定伺服器連絡方式,讓用戶端有明確的連絡方式可以串連 */int listen(int fd_server, int backlog); /* 將fd_server轉換為被動通訊端,同時核心將listen到的請求的連絡方式放入隊列 */int accept(int fd_server, struct sockaddr *addr_client, int *addrlen); /* 返回用戶端socket的另一端,以此建立連線 *//* addr_client為傳出參數,存放請求串連方的連絡方式 ,如不需要刻意置為NULL */client:int connect (int fd_client,struct sockaddr *addr_server, int addrlen); /* 通過伺服器的連絡方式addr_server去串連伺服器 *//* 作為伺服器,一定要綁定連絡方式,不然請求方沒有明確的連絡方式可以串連 ,   作為用戶端,可以不用綁定連絡方式,其連接埠號碼會由系統自動分配。             建立連線的關鍵在於accept函數會返回用戶端socket描述符所對應的另一端socket的描述符,   並且用戶端的連絡方式也可以在accept中使用傳出函數擷取。                              */   after connect:/* 建立連線後,就可以利用socket描述符發送接收資訊了 */int recv(int sockfd,void *buf,int len,unsigned int flags);
int send(int s,const void * msg,int len,unsigned int flags);
/* 會話結束,關閉 */int close(int fd);
UDP
UDPserver:int socket(int domain, int type, int protocol);/* 綁定伺服器連絡方式,讓用戶端有明確的連絡方式可以串連 */int bind(int fd_server, struct sockaddr *addr_server, int addrlen); /* 由於fd_server已經綁定連絡方式(addr_server),請求方發送資訊時,會通過addr_server發送訊息至伺服器fd_server,   因此,伺服器可以通過fd_server收到訊息,並且請求方的連絡方式可以通過傳出參數addr_client擷取                */int recvfrom(int fd_server, void *buf, int len, unsigned int flags, struct sockaddr *addr_client, int *addrlen); /* 請求方的連絡方式(addr_client)會由系統自己綁定,伺服器是通過recvfrom的傳出參數擷取addr_client的。   因此伺服器發送訊息時,可以通過用戶端連絡方式addr_client發送至用戶端fd_client。                  */int sendto(int fd_server, const void *msg, int len, unsigned int flags, const struct sockaddr *addr_client, int addrlen);client:/* 用戶端的連絡方式,伺服器可以在recvfrom時擷取,因此沒有必要在一開始就綁定 */int sendto(int fd_server, const void *msg, int len, unsigned int flags, const struct sockaddr *addr_client, int addrlen);int recvfrom(int fd_server, void *buf, int len, unsigned int flags, struct sockaddr *addr_client, int *addrlen); /* 實際上,UTP通訊方式並沒有建立socket連線,雙方均是通過連絡方式(IP和連接埠號碼)進行通訊的。   伺服器需要在一開始綁定連絡方式,不然請求方沒有明確的連絡方式可以串連。   當伺服器recvfrom,不但可以收到用戶端的訊息,同時可以擷取用戶端的連絡方式。            */
總結

1. TCP通訊會建立連線。伺服器的socket連接埠會bind連絡方式,給用戶端一個明確的連絡方式去connect。伺服器會listen到用戶端的connect,並將其連絡方式放入核心維護的工作要求隊列中。之後伺服器accept,擷取與用戶端通訊的對應socket連接埠,從而建立連線!之後雙方通過socket連接埠進行通訊。

2. UDP通訊不會建立連線。伺服器的socket連接埠同樣會bind連絡方式。用戶端通過此連絡方式向伺服器發送(sendto)訊息,由於此連絡方式已綁定到伺服器的socket連接埠,因此伺服器一定可以收到(recvfrom)訊息,與此同時通過recvfrom的傳出參數擷取用戶端的連絡方式,從而可以通過用戶端的連絡方式向用戶端發送訊息。即,UTP的通訊是基於連絡方式(IP和連接埠號碼)的。是不可靠的通訊方式。

3. 為什麼TCP中的accept與UDP中的recvfrom都可以通過傳出參數擷取對方連絡方式?不理解的話,可以類比寄信,別人給你寄一封信時,總會寫上自己的連絡方式吧。

Linux網路編程4——個人總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.