套接字程式設計 基於UDP協議的通訊程式設計

2021-10-19 05:13:14 字數 3419 閱讀 8814

udp協議

服務端server的任務

建立套接字

在核心中建立乙個socket結構體,使程序與通訊網卡之間建立聯絡。

為套接字繫結位址

在建立的socket結構體中描述埠,ip,協議資訊 為了告訴作業系統,當前這個套接字使用了哪個埠,若是收到了發往這個埠的資料則交給這個套接字進行處理 ,注意只能繫結本機上已有的ip位址。

接收資料

通過建立套接字的控制代碼,找到核心中socket結構體,然後從結構體的接收緩衝區中,取出一條資料 ,因為udp無連線,因此接收資料的同時,也會接收傳送端的位址資訊,標明當前接收的資料是哪個客戶端傳送的。

傳送資料

通過建立套接字的控制代碼,找到核心中socket結構體,將要傳送資料放到傳送緩衝區中,系統會選擇合適的時候封裝資料進行傳送。傳送資料的時候需要指定對端的位址資訊,描述到底要給誰發資料。

關閉套接字,釋放資源

客戶端client的任務

建立套接字

為套接字繫結位址資訊

繫結的位址資訊實際上不僅描述接收到的哪些資料應該交給socket處理,並且還會在傳送資料時候的描述源端位址資訊,但是客戶端不推薦主動繫結位址,因為在程式中主動繫結意味著要指定乙個固定的埠,但是有可能會存在埠衝突。當在傳送資料時候,系統發現socket沒有繫結位址,則會選擇乙個合適的位址埠進行繫結。

傳送資料

接收資料

關閉套接字釋放資源

udp_server.c

#include

#include

#include

#include

//位址結構

#include

//位元組序轉換介面

#include

//套接字介面

intmain()

//2.繫結位址

struct sockaddr_in addr;

addr.sin_family=af_inet;

addr.sin_port=

htons

(9000);

addr.sin_addr.s_addr=

inet_addr

("0.0.0.0");

socklen_t len=

sizeof

(addr)

;int ret =

bind

(sockfd,

(struct sockaddr*

)&addr,len);if

(ret<0)

while(1

);struct sockaddr_in cliaddr;

ret=

recvfrom

(sockfd,tmp,

1023,0

,(struct sockaddr*

)&cliaddr,

&len);if

(ret<0)

printf

("%s:%d say:%s\n"

,inet_ntoa

(cliaddr.sin_addr)

,ntohs

(cliaddr.sin_port)

,tmp)

;//4.傳送資料

memset

(tmp,

0x00

,1024);

printf

("server say:");

fflush

(stdout);

scanf

("%s"

,tmp)

; ret=

sendto

(sockfd,tmp,

strlen

(tmp),0

,(struct sockaddr*

)&cliaddr,len);if

(ret<0)

}//5.關閉套接字

close

(sockfd)

;return0;

}

udp_client.c

#include

#include

#include

#include

//位址結構

#include

//位元組序轉換介面

#include

//套接字介面

intmain()

struct sockaddr_in srv_addr;

srv_addr.sin_family=af_inet;

srv_addr.sin_port=

htons

(9000);

srv_addr.sin_addr.s_addr=

inet_addr

("192.168.204.144");

socklen_t len=

sizeof

(srv_addr)

;//3.傳送資料

while(1

);printf

("client say:");

fflush

(stdout);

scanf

("%s"

,tmp)

;int ret=

sendto

(sockfd,tmp,

strlen

(tmp),0

,(struct sockaddr*

)&srv_addr,len);if

(ret<0)

//4.接收資料

memset

(tmp,

0x00

,1024);

ret=

recvfrom

(sockfd,tmp,

1023,0

,null

,null);

if(ret<0)

printf

("server say:%s\n"

,tmp);}

//5.關閉套接字

close

(sockfd)

;return0;

}

通訊演示

基於UDP協議通訊的套接字

udp協議沒有粘包問題,但是緩衝區大小要足夠裝資料報大小,建議不要超過 512 服務端 服務端 import socket server socket.socket socket.af inet,socket.sock dgram 資料報協議 udp server.bind 127.0.0.1 80...

基於UDP協議的socket套接字程式設計

目錄socket套接字包括使用tcp協議和udp協議進行通訊 socket指定使用udp通訊協議server socket.socket socket.af inet,type socket.sock dgram 傳送udp資料server.sendto 傳送資料 接收udp資料data,addr ...

基於UDP協議的socket套接字程式設計

import socket server socket.socket socket.af inet,socket.sock dgram 資料報協議 udp server.bind 127.0.0.1 8080 while true data,client addr server.recvfrom 1...