Tcp與Udp(C語言版)

2021-06-08 17:07:44 字數 3906 閱讀 5062

tcp:transmission control protocol 傳輸控制協議tcp是一種面向連線(連線導向)的、可靠的、基於位元組流的運輸層(transport layer)通訊協議,在 osi模型中,它完成第四層傳輸層所指定的功能。

udp:是user datagram protocol的簡稱,使用者資料報協議,是 osi 參考模型中一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務。

tcp和udp傳輸就類似於我們的手機通**和手機發簡訊,一種必需連通了,才能夠通話,相對來說比較可靠,傳輸速度比較快,另一種可以在關機狀態(無連線)傳送資訊,相對來說,可靠性比較差,傳輸速度較慢。具體的差別如下:

tcp協議面向連線,udp協議面向非連線

tcp協議傳輸速度慢,udp協議傳輸速度快

tcp協議保證資料順序,udp協議不保證

tcp協議保證資料正確性,udp協議可能丟包

tcp協議對系統資源要求多,udp協議要求少

tcp伺服器端的編寫步驟:

tcp程式設計的客戶端一般步驟是:

1、建立乙個socket,用函式socket();

2、設定socket屬性,用函式setsockopt();* 可選

3、繫結ip位址、埠等資訊到socket上,用函式bind();* 可選

4、設定要連線的對方的ip位址和埠等屬性;

5、連線伺服器,用函式connect()(相當於撥號);

6、收發資料,用函式send()和recv(),或者read()和write()(相當於通話);

7、關閉網路連線;

伺服器端源**如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define maxbuf 1024

int main(int argc, char **argv)

else printf("socket created\n");

bzero(&my_addr, sizeof(my_addr));

my_addr.sin_family = pf_inet;

my_addr.sin_port = htons(myport);

if(argv[3]) my_addr.sin_addr.s_addr = inet_addr(argv[3]);

else my_addr.sin_addr.s_addr = inaddr_any;

if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1)

else printf("binded\n");

if (listen(sockfd, lisnum) == -1)

else printf("begin listen\n");

while(1)

else printf("server: got connection from %s, port %d, socket %d\n",inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port), new_fd);

/* 開始處理每個新連線上的資料收發 */

bzero(buf, maxbuf + 1);

strcpy(buf, "這是在連線建立成功後向客戶端傳送的第乙個訊息\n只能向new_fd這個用accept函式新建立的socket發訊息,不能向sockfd這個監聽socket傳送訊息,監聽socket不能用來接收或傳送訊息\n");

/* 發訊息給客戶端 */

len = send(new_fd, buf, strlen(buf), 0);

if(len < 0)

else printf("訊息'%s'傳送成功,共傳送了%d個位元組!\n", buf, len);

bzero(buf, maxbuf + 1);

/* 接收客戶端的訊息 */

len = recv(new_fd, buf, maxbuf, 0);

if(len > 0) printf("接收訊息成功:'%s',共%d個位元組的資料\n", buf, len);

else printf("訊息接收失敗!錯誤**是%d,錯誤資訊是'%s'\n", errno, strerror(errno));

/* 處理每個新連線上的資料收發結束 */

}close(sockfd);

return 0;

}客戶端源**如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define maxbuf 1024

int main(int argc, char **argv)

/* 建立乙個 socket 用於 tcp 通訊 */

if ((sockfd = socket(af_inet, sock_stream, 0)) < 0)

printf("socket created\n");

/* 初始化伺服器端(對方)的位址和埠資訊 */

bzero(&dest, sizeof(dest));

dest.sin_family = af_inet;

dest.sin_port = htons(atoi(argv[2]));

if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0)

printf("address created\n");

/* 連線伺服器 */

if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0)

printf("server connected\n");

/* 接收對方發過來的訊息,最多接收 maxbuf 個位元組 */

bzero(buffer, maxbuf + 1);

/* 接收伺服器來的訊息 */

len = recv(sockfd, buffer, maxbuf, 0);

if(len > 0) printf("接收訊息成功:'%s',共%d個位元組的資料\n", buffer, len);

else printf("訊息接收失敗!錯誤**是%d,錯誤資訊是'%s'\n", errno, strerror(errno));

bzero(buffer, maxbuf + 1);

strcpy(buffer, "這是客戶端發給伺服器端的訊息\n");

/* 發訊息給伺服器 */

len = send(sockfd, buffer, strlen(buffer), 0);

if(len < 0) printf("訊息'%s'傳送失敗!錯誤**是%d,錯誤資訊是'%s'\n", buffer, errno, strerror(errno));

else printf("訊息'%s'傳送成功,共傳送了%d個位元組!\n", buffer, len);

/* 關閉連線 */

close(sockfd);

return 0;

}編譯兩個程式用下列命令:

gcc -wall ******-server.c -o server

gcc -wall ******-client.c -o client

啟動服務端程式用如下命令:

./server 7838 1

啟動客戶端程式用如下命令:

./client 127.0.0.1 7838

就可以完成通訊功能。

C語言版掃雷

用c語言實現掃雷,首先應該有基本的思路,建立兩個相同大小的陣列,乙個用於布雷 初始化為全0,布雷時將雷置為1 另乙個給使用者展示 初始化為星號,使用者輸入座標後統計周圍雷的分布並列印雷的個數 由於需要統計每個座標周圍類的個數,所以將陣列建立大一圈,以方便統計。若輸了,列印出雷陣告訴玩家雷的分布。具體...

雙截棍 C語言版

雙截棍c 語言版 軟考室的菸味瀰漫坐滿了程式設計師 室裡面的監考官係分已三年 出上午試題的老師練cpu 耍微控制器 硬體功夫最擅長還會邏輯門三極體 他們學生我習慣從小就耳濡目染 什麼軟體跟網路我都耍的有摸有樣 什麼語言最喜歡c 物件導向 想要去英倫美帝學圖靈諾伊曼 怎麼編怎麼編離散數學是關鍵 怎麼編...

棧 C語言版

棧 lifo 運算所限的線性表,限制它的插入和刪除操作僅在表的一段進行。棧頂 top 插入 刪除。另一端為棧底。n 0稱為空棧,插入新元素稱為入棧 進棧。刪除稱為出棧 退棧。特點 先進後出。基本運算 初始化棧 判斷空 入棧 出棧 讀棧頂元素。順序棧儲存結構 初始化棧 stack init 判斷空 入...