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

2021-06-04 10:36:35 字數 4330 閱讀 3564

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

就可以完成通訊功能。

網路通訊 TCP和UDP 一

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

java網路通訊TCP與UDP

system.out.println 客戶端啟動 socket socket new socket 192.168.0.33 8080 outputstream os socket.getoutputstream 會的輸出流 outputstreamwriter osw new outputstre...

網路通訊udp與tcp的區別

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