TCP和UDP網路通訊的區別及實現方式

2021-05-25 21:17:36 字數 3988 閱讀 6795

華清遠見嵌入式學院

講師。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

就可以完成通訊功能。

www.farsight.com.cn

網路通訊udp與tcp的區別

1.建立套接字 2.繫結ip和埠號 3.使用套接字收 發資料 記得解碼 decode 和編碼 encode 哦 4.關閉套接字 coding utf 8 from socket import 1.建立套接字 udp socket socket af inet,sock dgram 2.繫結本地的相關...

網路通訊 TCP和UDP 一

要搞清楚網路中程序間是如何通訊的,首先就得解決 如何標誌乙個程序 網路層的 ip位址 可以唯一標識網路中的主機,而傳輸層的 協議 埠 可以唯一標識主機中的應用程式 程序 這樣利用三元組 ip位址,協議,埠 就可以標識網路的程序了,網路中的程序通訊就可以利用這個標誌與其它程序進行互動。tcp和udp ...

17 TCP和UDP網路通訊的區別及實現方式

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