c 實現tcp伺服器 TCP套接字 C實現

2021-10-17 08:09:43 字數 3964 閱讀 2890

udp套接字的介紹見另一篇文章:

這篇文章已經介紹了很多基礎的巢狀字的函式,在這裡不做贅述,這篇實驗報告,只介紹udp中沒有的函式.

實際上套接字是網際網路應用程式的介面,可以把它理解為你辦公室的門:當你想從你的辦公室給同事傳遞訊息時,你住需要把信放在門口,然後會有人(傳輸層等)會把信放到你的同事的門口,最後他就可以從門口拿到信讀取其中的資訊.這扇門之後發生的傳遞工作都是傳輸層的事情,跟應用層沒關係.

由於套接字的庫很多,在此不做詳細解釋,程式中使用到的資料型別和函式統一包括在下面的庫函式中:

#include #include #include #include #include #include #include #include
tcp套接字的資訊傳遞建立在鏈結的基礎上,因此tcp是可靠的傳遞方式.

執行環境為windows子系統ubuntu 18.04 lts

tcp套接字我實現的功能稍微多一點具體如下:

(1)客戶程式接收輸入的一段字串並且把字串傳遞給伺服器;

(2)伺服器接受客戶程式傳來的字串,輸出客戶程式的位址和字串;

(3)伺服器將當前時間、使用者的位址、使用者傳來的字串返回給客戶程式;

(4)客戶程式接受伺服器傳來的資訊,並且輸出全部資訊.

下面分塊介紹伺服器端程式.

首先宣告套接字,必須要提的是,連線型別是sock_stream,協議型別是ipproto_tcp

// 建立tcp套接字

int server_fd = socket(af_inet, sock_stream, ipproto_tcp);

接下來設定伺服器端的位址,並且繫結位址,這裡都在udp巢狀字中講解過了

// 設定伺服器的位址

struct sockaddr_in myaddr;

myaddr.sin_family = af_inet;

// host to network long從主機位元組序到網路位元組序的轉換

// 監聽所有的ip位址

myaddr.sin_addr.s_addr = htonl(inaddr_any);

// 埠號

myaddr.sin_port = htons(6240);

// 將伺服器的套接字繫結到位址上

bind(server_fd, (struct sockaddr *)&myaddr, sizeof(myaddr));

然後要讓伺服器端程式建立監聽佇列,這裡儲存未處理的請求;

listen函式的第乙個引數就是伺服器的巢狀字;

第二個引數是佇列的長度;

// 建立套接字佇列

listen(server_fd, 5);

接下來是一些儲存客戶端套接字、位址、傳來的資訊的變數

// 緩衝區長度

const int maxbuf = 256;

// 接受客戶的緩衝區,和傳送的緩衝區

char *buffer_reci, *buffer_send;

// 建立了乙個客戶的位址,用來儲存客戶端的位址資訊

struct sockaddr_in client_addr;

// 客戶位址長度

int addr_len = sizeof(client_addr);

// 客戶的套接字,用來儲存客戶端的套接字資訊

int client_fd;

伺服器迴圈處理客戶端請求的迴圈結構省略,直接看伺服器接受客戶端請求的函式accpet;

函式的第乙個引數是伺服器的套接字;

第二個引數是用來儲存客戶端位址的引數,注意要將他轉成通用的位址結構struct sockaddr *;

第三個引數是位址結構的大小;

// 使用accept函式等待客戶的請求

client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len);

伺服器和客戶端建立好連線後開始接受客戶端的資料.由於已經建立好一對一的鏈結,因此接收資料的函式read_from_client要比udp的函式簡單的多.

引數就是客戶端的套接字(這個套接字不需要在前面和剛剛收到的位址繫結在一起),返回的就是客戶端傳來資料

// 從客戶端接受資訊

buffer_reci = read_from_client(client_fd);

接下來是向客戶端傳遞資訊的函式,這個函式也比udp簡單

第乙個引數是客戶端的套接字;

第二個引數是傳送的字串;

第三個引數是緩衝區的大小;第四個引數不用管,傳0

// 向客戶端傳遞時間

int cc = send(client_fd, buffer_send, strlen(buffer_send), 0);

下面是全部的伺服器端的**

#include #include #include #include #include #include #include #include #include char *read_from_client(int sock);

void _pause();

char *itoa(int num);

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

return 0;

}char *read_from_client(int sock)

void _pause()

}char *itoa(int num)

// printf("%d %dn", i, times);

times = 10;

--i;

while(i >=0)

return str;

}

客戶端詳細介紹一下傳送資訊的函式和接收資訊的函式就差不多了,其他的操作都在伺服器端裡面有.

第乙個引數為客戶端的套接字;

第二個引數為要傳遞的字串;

第三個引數為字串的最大長度,也就是緩衝區的大小;

// 客戶向伺服器傳輸資料時用的函式

int nbytes = write(client_fd, buffer_send, maxbuf);

接收資訊的函式recv:

第乙個引數是客戶端的套接字;

第二個引數是儲存資訊的字串;第三個引數不用管,給0;

這裡解釋一下返回值是字串的長度,因此給字串加上結束符'0';

int cc = recv(client_fd, _time, maxbuf, 0);

_time[cc] = '0';

printf("the time is: %s", _time);

接下來是客戶端的全部**:

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

首先啟動伺服器程式如下

然後啟動客戶端程式,客戶端程式執行完之後結果如下:

回過頭來看伺服器程式:

c語言的細節真多,啥時候放一下python的套接字真心無腦……

使用套接字實現簡單TCP伺服器客戶端模型

利用套接字實現乙個簡單的tcp伺服器客戶端模型基本步驟如下 1.建立套接字 include include int socket int domain,int type,int protocol 引數描述 domian 協議域,af inet 對應 ipv4,af inet6 對應 ipv6,af ...

TCP的套接字

摘自 深入理解計算機網路 王達著 機械工業出版社 1.ipv4資料報頭部格式 2.ipv6資料報頭部格式 3.ipv4資料報的封裝與解封裝 4.ipv4資料報的分段與重組 5.arp協議報文格式及arp表 6.arp位址解析原理 7.icmp協議及報文格式 8.ipv6協議族的其它協議 9.tcp的...

TCP套接字程式設計

網路程式設計又稱為套接字程式設計,為了與遠端計算機進行資料傳輸,需要連線到網際網路,而程式設計中的 套接字 就是用來連線該網路的工具。它本身具有連線的含義,還可以表示為兩台計算機之間的網路連線。4.呼叫accept函式受理連線請求 基於tcp的服務端 客戶端 tcp伺服器端預設函式呼叫順序 sock...