Linux TCP協議程式設計流程

2021-10-08 12:31:02 字數 3195 閱讀 4927

tcp協議:面向連線的,可靠的、位元組流服務

udp協議:無連線的,不可靠的,資料報服務

伺服器:一般為被動通訊;客戶端:一般為主動通訊

1、伺服器端程式設計流程

(1)int socket();建立乙個用於監聽客戶端鏈結的網路套接字

int socket(int domain,int type,int protocol);

(2)int bind();將建立的套接字與本端的位址資訊進行繫結(ip位址+埠號)

int bind(int sockfd,const struct sockaddr* addr,socklen_t addrlen);

結構體:

struct sockaddr_in

;

struct in_addr

;

主機位元組序和網路位元組序之間的轉換: 

#includeunsigned long int htonl(unsigned long int hostlong);//主機位元組序轉網路位元組序(32bit的長整型)

unsigned short int htonl(unsigned short int hostshort);//主機位元組序轉網路位元組序(16bit的短整型)

unsigned long int ntohl(unsigned long int netlong);//網路位元組序轉主機位元組序(32bit的長整型)

unsigned short int ntohs(unsigned short int netshort);//網路位元組序轉主機位元組序(16bit的短整型)

#includein_addr_t inet_addr(const char* strptr);//將用點分十進位制字串表示的ipv4位址轉化為用網路位元組序整數表示的ipv4位址。

int inet_aton(const char* cp,struct in_addr* inp);//完成inet_addr函式同樣的功能,但是將轉化結果儲存於引數inp指向的位址結構中。該函式成功時返回1,失敗返回-1。

char* inet_ntoa(struct in_addr in);//將用網路位元組序整數表示的ipv4位址轉化為用點分十進位制字串表示的ipv4位址。

(3)int listen();啟動監聽,不會阻塞

int listen(int sockfd,int backlog);

(4)int accept();接收乙個客戶端的鏈結,返回的是乙個客戶端鏈結的套接字

int accept(int sockfd,struct sockaddr *addr,socklen_t* addrlen);//接收連線

sockfd:經過listen的監聽套接字

addrlen:位址結構的長度

(5)int recv();/intsend();讀取資料或者傳送資料

讀取資料(類似read)

int recv(int sockfd,void* buf,size_t len,int flags);//讀取sockfd上的資料

傳送資料  (類似write)

int send(int sockfd,const void* buf,size_t len,int flags);//往sockfd上寫入資料

(6)int close();關閉檔案描述符(套接字),如果關閉的是accept返回的套接字,是關閉和客戶端的鏈結;如果關閉的是socket返回的套接字,是將服務關掉。

int close(int fd);//關閉連線

2、客戶端程式設計流程(1)int socket();建立乙個用於整個通訊的套接字(2)int connect();與伺服器程式建立鏈結;成功返回成功,失敗返回-1(三次握手)

int accept(int sockfd,struct sockaddr *addr,socklen_t* addrlen);//接收連線

(3)int recv();/intsend();讀取資料或者傳送資料(4)int close();關閉(四次揮手)注意:(1)客戶端和伺服器必須乙個recv,乙個send

(2)客戶端和伺服器int recv();/int send();這個流程必須用迴圈來保證可以多次傳送

(3)伺服器的accept、recv/send、close必須用迴圈保證可以迴圈處理多個客戶端鏈結

(1)send和recv的次數是沒有直接關係的。

(2)傳送端send的次數與底層tcp報文段的個數也是沒關係的

(3)一次recv如果沒有將資料讀取完成,剩餘的資料會繼續儲存在接收緩衝區中,下次recv會接著上一次的位置讀取

粘包問題:兩次send傳送的資料接收方一次recv接受了

粘包問題的解決方法:規定好要傳送資料的長度length,先將length傳送,然後接收方會根據接收的length來接收資料。也就是用協議的方式控制資料的接收。

Linux TCP協議的程式設計流程

一 定義 tcp協議是面向連線的可靠的位元組流服務 tcp協議分為客戶端和服務端 伺服器是被動通訊,客戶端是主動通訊 二 伺服器的系統呼叫 1 方法 1 int socket 建立乙個用於監聽客戶端連線的網路套接字 原型 成功返回套接字的檔案描述符,失敗返回 1 domain 協議簇 af inet...

linux TCP程式設計示例

linux tcp程式設計 主要是這幾個函式 socket send recv write read close 伺服器端專用 bind listen accept 客戶端專用 connect tcp客服端 tcp client.c tcp相關標頭檔案 include include include...

Linux TCP套接字程式設計

服務端程式設計的步驟如下 建立服務端套接字。繫結套接字到乙個ip位址和乙個埠上 使用bind函式 將套接字設定為監聽模式等待連線請求 使用函式listen 這個套接字就是監聽套接字了。請求到來後,接受連線請求。返回乙個新的對應此連線的套接字。用返回的新的套接字和客戶端進行通訊,即傳送或接收資料 使用...