簡要介紹udp原理,通過**例項講解。
本篇部落格不強調server跟client 的概念,重在實現雙方互通。
收的一方: socket()->bind()->recvfrom()->close()
發的一方:socket()->sendto()->close()
只有收資料的一方需要bind(),而傳送的一方不需要bind()。由上圖可以看出,bind()的一方只有收到訊息(recvfrom)後才能給另一方傳送訊息。
同一臺電腦如果要實現互發訊息,則無法同時bind()同乙個埠號,兩方需要bind()不同的埠號才能實現自由互發,否則bind()的一方將會出現阻塞等待訊息的現象。
下面**中介紹udp的c++實現。
1.設定兩個埠實現互發資料
接受一方:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main()
// 設定位址與埠
struct sockaddr_in addr;
socklen_t addr_len=sizeof(addr);
memset(&addr, 0, sizeof(addr));
addr.sin_family = af_inet; // use ipv4
addr.sin_port = htons(port_out); //
addr.sin_addr.s_addr = htonl(inaddr_any);
// time out
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 200000; // 200 ms
setsockopt(sockfd, sol_socket, so_rcvtimeo, (const
char*)&tv, sizeof(struct timeval));
// bind 埠,用來接受之前設定的位址與埠發來的資訊,作為接受一方必須bind埠,並且埠號與傳送方一致
if (bind(sockfd, (struct sockaddr*)&addr, addr_len) == -1)
char buffer[128];
memset(buffer, 0, 128);
int counter = 0;
while(1)
else
}close(sockfd);
return
0;}
傳送一方:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main()
// 設定位址與埠
struct sockaddr_in addr;
socklen_t addr_len=sizeof(addr);
memset(&addr, 0, sizeof(addr));
addr.sin_family = af_inet; // use ipv4
addr.sin_port = htons(port_in); //
addr.sin_addr.s_addr = htonl(inaddr_any);
// time out
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 200000; // 200 ms
setsockopt(sockfd, sol_socket, so_rcvtimeo, (const
char*)&tv, sizeof(struct timeval));
// 繫結獲取資料的埠,作為傳送方,不繫結也行
if (bind(sockfd, (struct sockaddr*)&addr, addr_len) == -1)
int counter = 0;
while(1)
close(sockfd);
return
0;}
2.設定乙個埠號實現互發資料
server方必須收到一次client方的資料後,才能實現隨意互發資料。
使用方法為:執行server->執行client->鍵盤在client輸入->隨意互發資料。
server:
//只有在server接收到訊息後才能實現互發資料
#include
#include
#include
#include
#include
#include
#include
#include
#define server_port 8888//唯一埠號
int main()
//設定位址與埠
addrlen=sizeof(struct sockaddr_in);
bzero(&ser_addr,addrlen);
ser_addr.sin_family=af_inet;
ser_addr.sin_addr.s_addr=htonl(inaddr_any);
ser_addr.sin_port= htons (server_port);
//server繫結,才能接受client的資料
if(bind(ser_sockfd,(struct sockaddr *)&ser_addr,addrlen)<0)
while(1)
if(fd_isset(0, &rfds))//鍵盤輸入會觸發進入}}
return
0;}
client:
#include
#include
#include
#include
#include
#include
#include
#define server_port 8888 //唯一埠
int main(int argc,char **argv)
//配置位址與埠
addrlen=sizeof(struct sockaddr_in);
bzero(&cli_addr,addrlen);
cli_addr.sin_family=af_inet;
cli_addr.sin_addr.s_addr=htonl(inaddr_any);//任何主機位址
cli_addr.sin_port=htons(server_port);
//這裡作為傳送方,不需要繫結bind()
while(1)
if(fd_isset(0, &rfds))//鍵盤輸入會觸發進入}}
close(cli_sockfd);
return
0;}
補充:inet_addr(「127.0.0.1」)將乙個點分十進位制的ip轉換成乙個長整數型數(u_long型別)。
waldm
C 實現UDP通訊
using system using system.text using system.net using system.net.sockets namespace udptest dns.gethostname 設定服務ip,設定tcp埠號 ipendpoint ip newipendpoint ...
Linux下C語言實現簡單的udp通訊
用c語言實現udp 通訊。寫乙個udp 的客戶端,可以向外傳送訊息。再寫乙個udp服務端,接收客戶端的訊息,並且列印出來。事先說明 在window和linux中有一下結構 struct sockaddr struct sockaddr in 在netinet in.h 中定義 儲存ip位址,使用in...
Linux下的UDP通訊
日期 2012 06 02 字型 大中小 今天我們介紹如何編寫linux下的udp程式,關於tcp程式可以參考這裡 由於udp通訊不需要事先建立連線,因此不需要tcp中的connect函式。伺服器端的步驟如下 1.socket 建立乙個socket 2.bind 將這個socket繫結在某個埠上 a...