linux UDP 通訊使用例項

2021-06-23 10:08:09 字數 3335 閱讀 1297

udp server程式

1、編寫udp server程式的步驟

(1)使用socket()來建立乙個udp socket,第二個引數為sock_dgram。

(2)初始化sockaddr_in結構的變數,並賦值。sockaddr_in結構定義:

struct sockaddr_in ;

這裡使用「08」作為服務程式的埠,使用「inaddr_any」作為繫結的ip位址即任何主機上的位址。

(3)使用bind()把上面的socket和定義的ip位址和埠繫結。這裡檢查bind()是否執行成功,如果有錯誤就退出。這樣可以防止服務程式重複執行的問題。

(4)進入無限迴圈程式,使用recvfrom()進入等待狀態,直到接收到客戶程式傳送的資料,就處理收到的資料,並向客戶程式傳送反饋。這裡是直接把收到的資料發回給客戶程式。

2、udpserv.c程式內容:

#include #include #include #include #include #include #define maxline 80

#define serv_port 8888

void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)

}int main(void)

do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));

return 0;

}udp client程式

1、編寫udp client程式的步驟

(1)初始化sockaddr_in結構的變數,並賦值。這裡使用「8888」作為連線的服務程式的埠,從命令列引數讀取ip位址,並且判斷ip位址是否符合要求。

(2)使用socket()來建立乙個udp socket,第二個引數為sock_dgram。

(3)使用connect()來建立與服務程式的連線。與tcp協議不同,udp的connect()並沒有與服務程式三次握手。上面我們說了udp是非連線的,實際上也可以是連線的。使用連線的udp,kernel可以直接返回錯誤資訊給使用者程式,從而避免由於沒有接收到資料而導致呼叫recvfrom()一直等待下去,看上去好像客戶程式沒有反應一樣。

(4)向服務程式傳送資料,因為使用連線的udp,所以使用write()來替代sendto()。這裡的資料直接從標準輸入讀取使用者輸入。

(5)接收服務程式發回的資料,同樣使用read()來替代recvfrom()。

(6)處理接收到的資料,這裡是直接輸出到標準輸出上。

2、udpclient.c程式內容:

#include #include #include #include #include #include #include #include #define maxline 80

#define serv_port 8888

void do_cli(file *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen)

while(fgets(sendline, maxline, fp) != null)

recvline[n] = 0; /* terminate string */

fputs(recvline, stdout);}}

int main(int argc, char **argv)

/* init servaddr */

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = af_inet;

servaddr.sin_port = htons(serv_port);

if(inet_pton(af_inet, argv[1], &servaddr.sin_addr) <= 0)

sockfd = socket(af_inet, sock_dgram, 0);

do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

return 0;

}執行例子程式

1、編譯例子程式

使用如下命令來編譯例子程式:

gcc -wall -o udpserv udpserv.c

gcc -wall -o udpclient udpclient.c

編譯完成生成了udpserv和udpclient兩個可執行程式。

2、執行udp server程式

active internet connections (only servers)

proto recv-q send-q local address foreign address state

tcp 0 0 0.0.0.0:32768 0.0.0.0:* listen

tcp 0 0 0.0.0.0:111 0.0.0.0:* listen

tcp 0 0 0.0.0.0:6000 0.0.0.0:* listen

tcp 0 0 127.0.0.1:631 0.0.0.0:* listen

udp 0 0 0.0.0.0:32768 0.0.0.0:*

udp 0 0 0.0.0.0:8888 0.0.0.0:*

udp 0 0 0.0.0.0:111 0.0.0.0:*

udp 0 0 0.0.0.0:882 0.0.0.0:*

可以看到udp處有「0.0.0.0:8888」的內容,說明服務程式已經正常執行,可以接收主機上任何ip位址且埠為8888的資料。

如果這時再執行./udpserv &命令,就會看到如下資訊:

bind error: address already in use

說明已經有乙個服務程式在執行了。

3、執行udp client程式

執行./udpclient 127.0.0.1命令來啟動客戶程式,使用127.0.0.1來連線服務程式,執行效果如下:

hello, world!

hello, world!

this is a test

this is a test

^d輸入的資料都正確從服務程式返回了,按ctrl+d可以結束輸入,退出程式。

如果服務程式沒有啟動,而執行客戶程式,就會看到如下資訊:

$ ./udpclient 127.0.0.1

test

read error: connection refused

說明指定的ip位址和埠沒有服務程式繫結,客戶程式就退出了。這就是使用connect()的好處,注意,這裡錯誤資訊是在向服務程式傳送資料後收到的,而不是在呼叫connect()時。如果你使用tcpdump程式來抓包,會發現收到的是icmp的錯誤資訊。

linux UDP廣播通訊

2013 02 04 10 18 3881人閱讀收藏 舉報 c 語言 89 linux system 153 在除錯區域網內通過udp協議獲取其他裝置ip位址時,伺服器使用udp 廣播後,客戶端裝置無響應.先研究一下正常情況下,udp廣播通訊方法.參考了網路上一寫資料.整理如下 伺服器端向 255....

linux udp通訊程式

服務端程式為 include include include include include include include int main recvfrom isock,szbuf,sizeof szbuf 1,0,struct sockaddr srvaddr,socklen t srvadd...

程序通訊 使用WM COPYDATA訊息通訊

使用wm copydata訊息通訊 對於少量資料可以用wm copydata方便地實現通訊。由於sendmessage 是阻塞的,只有接收方響應了訊息,sendmessage 才能返回,否則一直阻塞。所以,對於大量資料來說,用sendmessage 就容易造成視窗假死。通過wm copydata訊息...