国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

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

2024-06-28 13:24:26
字體:
來源:轉載
供稿:網友
linux網絡編程4——個人總結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都可以通過傳出參數獲取對方聯系方式?不理解的話,可以類比寄信,別人給你寄一封信時,總會寫上自己的聯系方式吧。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 慈溪市| 缙云县| 白玉县| 文成县| 诏安县| 长海县| 阳朔县| 疏附县| 通榆县| 游戏| 株洲市| 遵义市| 曲水县| 安塞县| 明溪县| 汾西县| 桦甸市| 台东市| 揭东县| 来凤县| 徐汇区| 布拖县| 砀山县| 广汉市| 黄大仙区| 邢台市| 颍上县| 北宁市| 绥芬河市| 石狮市| 秦安县| 乌恰县| 韶关市| 上栗县| 南皮县| 株洲县| 婺源县| 邛崃市| 丹巴县| 江津市| 随州市|