Linux 傳輸層基於TCP協議的套接字程式設計例項

2021-09-27 08:55:31 字數 2196 閱讀 7956

1.含義:同udp相同也是傳輸層的一種協議。(transmission control protocol 傳輸控制協議)。

2.特點:面向連線、傳輸可靠、提供位元組流服務

面向連線:服務端必須與客戶端建立連線。

傳輸可靠:一系列的機制(應答等)保證資料傳輸的可靠性。

提供位元組流服務:傳送資料不會像udp那樣一次傳送(要麼成功,要麼失敗),而是靈活的傳送(能發多少發多少)。

3.流程:

tcp的3次握手,4次揮手

4.實現過程:

(1)建立乙個tcpsocket類封裝相應的功能

(2)服務端程式

(3)客戶端程式

5.存在問題:

服務端一次與乙個客戶端只能通訊一次

6.實現:

多程序實現:

#include #include #include "tcp_socket.hpp"

void sigcb(int signo)

int main(int argc, char* ar**)

signal(sigchld, sigcb);

string ip = ar**[1];

uint16_t port = atoi(ar**[2]);

tcpsocket sock;

//1.建立套接字

check_ret(sock.socket());

//2.繫結位址資訊

check_ret(sock.bind(ip,port));

//3.開始監聽

check_ret(sock.listen());

tcpsocket newsock;

while(1)

//if(fork() == 0)

if(fork() == 0)

cout << "client say:" << buf << endl;

//7.傳送資料

buf.clear();

cin >> buf;

newsock.send(buf);

}newsock.close();

exit(0);

}newsock.close();

} //8.關閉套接字

sock.close();

return -1;

}

多執行緒實現:

//多執行緒:服務端程式

#include #include "tcp_socket.hpp"

void* thr_start(void* arg)

cout << "client say:" << buf <> buf;

newsock->send(buf);

} newsock->close();

delete newsock;

return null;

}int main(int argc, char* ar**)

string ip = ar**[1];

uint16_t port = atoi(ar**[2]);

tcpsocket sock;

//1.建立套接字

check_ret(sock.socket());

//2.繫結位址資訊

check_ret(sock.bind(ip,port));

//3.開始監聽

check_ret(sock.listen());

while(1)

pthread_t tid;

//建立新執行緒,讓子執行緒來解決這些問題

pthread_create(&tid, null, thr_start, (void*)newsock);

pthread_detach(tid);

} //8.關閉套接字

sock.close();

return -1;

}

傳輸層 TCP協議

1 序號 在乙個tcp連線中傳送的位元組流中的每乙個位元組都按順序編號,本欄位表示本報文段所傳送資料的第乙個位元組的序號。2 確認號 期望收到對方下乙個報文段的第乙個資料位元組的序號。若確認號為n,則證明到序號n 1為止的所有資料都已正確收到。即採用累計確認 3 資料偏移 首部長度 tcp 報文段的...

傳輸層TCP協議

面向連線,可靠傳輸,面向位元組流 tcp協議 面向連線 accept 獲取新連線 1.當呼叫accept之後,核心就會為新連線建立乙個套接字描述符,服務端使用該套接字描述符進行和客戶端進行資料通訊 2.連線建立之後,雙方都可以傳送資料 確認msg1 確認的行為是傳輸層tcp協議的行為,不是應用層的行...

傳輸層協議TCP

部分埠號 第二次握手 伺服器應用程序被動開啟。若同意客戶端的請求,則發回確認報文,其首部中 syn 1,ack 1,ack x 1,seq y。第三次握手 客戶端收到確認報文之後,通知上層應用程序連線已建立,並向伺服器發出確認報文,其首部 ack 1,ack y 1。當伺服器收到客戶端的確認報文之後...