久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区

一種通過Udp進行無確認Ip的雙向的通信
來源:羽林君    時間:2022-11-27 07:52:38
前言

udp是一種不可靠的通信,但是有些時候還是會有使用。今天分享一個示例:主體邏輯,一個端口廣播地址,接收到ip地址數據后,其他端口基于這個ip進行bind綁定,最后通信,這樣可以保證我們后續繼續增加端口交互時候不需要關注ip地址綁定的問題。


(相關資料圖)

主要原理介紹低通信頻率端口進行服務端IP信息udp廣播,接收端是不固定IP監聽,監聽主機任意IP地址的特定端口接收到廣播通道的ip地址后,與特定IP、port建立tcp或者udp雙向高頻率通信。

下圖是基于 UDP 的 Socket 函數調用過程:

只有接收的時候需要bind ip和端口

socket 監聽所有ip 特定端口代碼:

#define PORT 6000bzero(&adr_inet, sizeof(adr_inet));adr_inet.sin_family = AF_INET;adr_inet.sin_addr.s_addr = htonl(INADDR_ANY);adr_inet.sin_port = htons(port);ret = bind(cfd, (struct sockaddr *)&addr, sizeof(addr));

socket綁定的ip為INADDR_ANY 的說明:

socket INADDR_ANY 監聽0.0.0.0地址 socket只綁定端口讓路由表決定傳到哪個ip

其中INADDR_ANY就是指定地址為0.0.0.0的地址,這個地址事實上表示不確定地址,或“所有地址”、“任意地址”。 如果指定ip地址為通配地址(INADDR_ANY),那么內核將等到套接字已連接(TCP)或已在套接字上發出數據報時才選擇一個本地IP地址。 一般情況下,如果你要建立網絡服務器,則你要通知服務器操作系統:請在某地址 xxx.xxx.xxx.xxx上的某端口 yyyy上進行偵聽,并且把偵聽到的數據包發送給我。這個過程,你是通過bind()系統調用完成的。——也就是說,你的程序要綁定服務器的某地址,或者說:把服務器的某地址上的某端口占為已用。服務器操作系統可以給你這個指定的地址,也可以不給你。

如果你的服務器有多個網卡,而你的服務(不管是在udp端口上偵聽,還是在tcp端口上偵聽),出于某種原因:可能是你的服務器操作系統可能隨時增減IP地址,也有可能是為了省去確定服務器上有什么網絡端口(網卡)的麻煩 —— 可以要在調用bind()的時候,告訴操作系統:“我需要在 yyyy 端口上偵聽,所以發送到服務器的這個端口,不管是哪個網卡/哪個IP地址接收到的數據,都是我處理的?!边@時候,服務器則在0.0.0.0這個地址上進行偵聽。無論連接哪個ip都可以連上的,只要是往這個端口發送的所有ip都能連上。

示例代碼:

data_send.c 在端口9001進行ip地址的udp廣播以及讀取終端數據廣播到7000端口

#include #include #include #include #include #include #include #include #include #include #include #define IP "127.0.0.1"#define#define// gcc data_send.c -o data_send -pthreadint cfd = -1;//接收線程函數void *receive(void *pth_arg){ int ret = 0; char name_data[3] = {0}; struct sockaddr_in addr0 = {0}; int addr0_size = sizeof(addr0); //從對端ip和端口號中接收消息,指定addr0用于存放消息 while (1) { bzero(name_data, sizeof(name_data)); ret = recvfrom(cfd, name_data, sizeof(name_data), 0, (struct sockaddr *)&addr0, &addr0_size); if (-1 == ret) { fprintf(stderr, "%d, %s :%s", __LINE__, "recv failed", strerror(errno)); exit(-1); } else if (ret > 0) { printf("\nname = %s ", name_data); //打印對方的消息和端口號 printf("ip %s,port %d \n", inet_ntoa(addr0.sin_addr), ntohs(addr0.sin_port)); } }}void *data_send(void *pth_arg){ int ret = 0; char data[] = "IP address"; struct sockaddr_in addr0 = {0}; addr0.sin_family = AF_INET; //設置tcp協議族 addr0.sin_port = htons(DATA_PORT); //設置端口號 addr0.sin_addr.s_addr = htonl(INADDR_ANY); //設置ip地址 //發送消息 while (1) { ret = sendto(cfd, (void *)data, sizeof(data), 0, (struct sockaddr *)&addr0, sizeof(addr0)); sleep(1); if (-1 == ret) { fprintf(stderr, "%d, %s :%s", __LINE__, "sendto failed", strerror(errno)); exit(-1); } }}int main(){ int ret = -1; //創建tcp/ip協議族,指定通信方式為無鏈接不可靠的通信 cfd = socket(AF_INET, SOCK_DGRAM, 0); if (-1 == cfd) { fprintf(stderr, "%d, %s :%s", __LINE__, "socket failed", strerror(errno)); exit(-1); } //進行端口號和ip的綁定 struct sockaddr_in addr; addr.sin_family = AF_INET; //設置tcp協議族 addr.sin_port = htons(PORT); //設置端口號 addr.sin_addr.s_addr = inet_addr(IP); //設置ip地址 ret = bind(cfd, (struct sockaddr *)&addr, sizeof(addr)); if (-1 == ret) { fprintf(stderr, "%d, %s :%s", __LINE__, "bind failed", strerror(errno)); exit(-1); } //創建線程函數,用于處理數據接收 pthread_t id,data_send_id; ret = pthread_create(&id, NULL, receive, NULL); if (-1 == ret) { fprintf(stderr, "%d, %s :%s", __LINE__, "pthread_create failed", strerror(errno)); exit(-1); } // pthread_join(id,NULL); ret = pthread_create(&data_send_id, NULL, data_send, NULL); if (-1 == ret) { fprintf(stderr, "%d, %s :%s", __LINE__, "pthread_create failed", strerror(errno)); exit(-1); } struct sockaddr_in addr0; addr0.sin_family = AF_INET; //設置tcp協議族 addr0.sin_port = htons(7000); //設置端口號 addr0.sin_addr.s_addr = inet_addr(IP); //設置ip地址 char name_send[3] = {0}; //發送消息 while (1) { bzero(name_send, sizeof(name_send)); printf("send name:"); scanf("%s", name_send); //發送消息時需要綁定對方的ip和端口號 ret = sendto(cfd, (void *)name_send, sizeof(name_send), 0, (struct sockaddr *)&addr0, sizeof(addr0)); if (-1 == ret) { fprintf(stderr, "%d, %s :%s", __LINE__, "accept failed", strerror(errno)); exit(-1); } } return 0;}

data_process.c 進行端口9001的ip數據的捕獲,當接收到ip數據后,綁定廣播的ip地址進行數據的收發,這里用的是udp接收大家也可以試試tcp交互。

#include #include #include #include #include #include #include #include #include #include #include #define IP "127.0.0.1"#define#define// typedef uint32_t in_addr_t;// gcc data_process.c -o data_process -pthreadint cfd = -1,data_fd = -1;uint32_t receive_ip = -1;void *receive(void *pth_arg){ int ret = 0; char name_data[3] = {0}; struct sockaddr_in addr0 = {0}; int addr0_size = sizeof(addr0); while (1) { printf("receive:"); bzero(name_data, sizeof(name_data)); ret = recvfrom(cfd, name_data, sizeof(name_data), 0, (struct sockaddr *)&addr0, &addr0_size); if (-1 == ret) { fprintf(stderr, "%d, %s :%s", __LINE__, "recv failed", strerror(errno)); exit(-1); } else if (ret > 0) { printf("\nname = %s ", name_data); printf("ip %s,port %d \n", inet_ntoa(addr0.sin_addr), ntohs(addr0.sin_port)); } }}void *data_receive(void *pth_arg){ int ret = 0; char name_data[10] = {0}; struct sockaddr_in addr0 = {0}; int addr0_size = sizeof(addr0); while (1) { bzero(name_data, sizeof(name_data)); ret = recvfrom(data_fd, name_data, sizeof(name_data), 0, (struct sockaddr *)&addr0, &addr0_size); if (-1 == ret) { fprintf(stderr, "%d, %s :%s", __LINE__, "recv failed", strerror(errno)); exit(-1); } else if (ret > 0) { printf("\nname = %s ", name_data); printf("ip %s,port %d \n", inet_ntoa(addr0.sin_addr), ntohs(addr0.sin_port)); receive_ip = addr0.sin_addr.s_addr; char buf[20] = { 0 }; inet_ntop(AF_INET, &receive_ip, buf, sizeof(buf)); printf("receive_ip ip = %s ", buf); // printf("receive_ip ip = %s ", inet_ntop(receive_ip)); break; } }}int main(){ int ret = -1; data_fd = socket(AF_INET, SOCK_DGRAM, 0); if (-1 == data_fd) { fprintf(stderr, "%d, %s :%s", __LINE__, "socket failed", strerror(errno)); exit(-1); } struct sockaddr_in addr; addr.sin_family = AF_INET; //設置tcp協議族 addr.sin_port = htons(DATA_PORT); //設置端口號 addr.sin_addr.s_addr = inet_addr(IP); //設置ip地址 ret = bind(data_fd, (struct sockaddr *)&addr, sizeof(addr)); if (-1 == ret) { fprintf(stderr, "%d, %s :%s", __LINE__, "bind failed", strerror(errno)); exit(-1); } pthread_t receive_id; ret = pthread_create(&receive_id, NULL, data_receive, NULL); if (-1 == ret) { fprintf(stderr, "%d, %s :%s", __LINE__, "pthread_create failed", strerror(errno)); exit(-1); } pthread_join(receive_id,NULL); cfd = socket(AF_INET, SOCK_DGRAM, 0); if (-1 == cfd) { fprintf(stderr, "%d, %s :%s", __LINE__, "socket failed", strerror(errno)); exit(-1); } struct sockaddr_in addr1; addr1.sin_family = AF_INET; //設置tcp協議族 addr1.sin_port = htons(PORT); //設置端口號 addr1.sin_addr.s_addr = receive_ip; //設置ip地址 char buf[20] = { 0 }; inet_ntop(AF_INET, &receive_ip, buf, sizeof(buf)); printf("ip = %s ", buf); ret = bind(cfd, (struct sockaddr *)&addr1, sizeof(addr1)); if (-1 == ret) { fprintf(stderr, "%d, %s :%s", __LINE__, "bind failed", strerror(errno)); exit(-1); } pthread_t id; ret = pthread_create(&id, NULL, receive, NULL); if (-1 == ret) { fprintf(stderr, "%d, %s :%s", __LINE__, "pthread_create failed", strerror(errno)); exit(-1); } pthread_join(id,NULL); struct sockaddr_in addr0; addr0.sin_family = AF_INET; //設置tcp協議族 addr0.sin_port = htons(6000); //設置端口號 addr0.sin_addr.s_addr = inet_addr(IP); //設置ip地址 char name_send[3] = {0}; while (1) { bzero(name_send, sizeof(name_send)); printf("send name:"); scanf("%s", name_send); ret = sendto(cfd, (void *)name_send, sizeof(name_send), 0, (struct sockaddr *)&addr0, sizeof(addr0)); if (-1 == ret) { fprintf(stderr, "%d, %s :%s", __LINE__, "accept failed", strerror(errno)); exit(-1); } } return 0;}

一個終端捕獲數據,sudo tcpdump -i lo portrange 5000-8000 -vv -XX -nn,另外兩個終端進行數據交互

結語

這就是我自己的一些udp設計思路的分享。如果大家有更好的想法和需求,也歡迎大家加我好友交流分享哈。

作者:良知猶存,白天努力工作,晚上原創公號號主。公眾號內容除了技術還有些人生感悟,一個認真輸出內容的職場老司機,也是一個技術之外豐富生活的人,攝影、音樂 and 籃球。

關鍵詞: 操作系統 服務器的 發送消息

上一篇:

下一篇:

X 關閉

X 關閉

久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区
亚洲视频一区在线| 国产亚洲午夜高清国产拍精品| 欧美一区二区三区免费观看| 亚洲一区二区三区在线视频| 亚洲国产高潮在线观看| 精品成人一区二区三区四区| 国产麻豆日韩欧美久久| 亚洲第一视频网站| 国产欧美一区二区三区久久| 国内不卡一区二区三区| 欧美日韩三级电影在线| 亚洲剧情一区二区| 欧美 日韩 国产在线| 国产伦精品一区二区三区免费| 99亚洲伊人久久精品影院红桃| 久久久久久久网站| 亚洲免费观看高清完整版在线观看熊| 欧美午夜精品久久久久久久| 久久aⅴ国产欧美74aaa| 国产精品久久97| 99精品热6080yy久久| 欧美伊人久久大香线蕉综合69| 久久久久久亚洲综合影院红桃| 久久综合五月| 亚洲国产精品精华液网站| 国产欧美日韩在线观看| 欧美日韩中文| 日韩午夜av电影| 久色成人在线| 欧美久久久久久久久久| 国产精品色在线| 久久精品国产99精品国产亚洲性色| 一区二区视频免费在线观看| 久久久国产精品一区二区三区| 欧美色精品天天在线观看视频| 在线日韩一区二区| 亚洲视频在线观看网站| 国产精品一卡| 亚洲一区在线观看免费观看电影高清| 日韩视频第一页| 国产综合精品| 一本综合久久| 亚洲国产精品成人精品| 亚洲美女区一区| 在线亚洲观看| 国产精品红桃| 国产精品久久久久999| 欧美午夜女人视频在线| 亚洲欧美清纯在线制服| 国产精品一区二区在线观看不卡| 国产精品一区二区黑丝| 欧美亚洲综合在线| 亚洲国产精品久久精品怡红院| 亚洲欧美区自拍先锋| 亚洲淫片在线视频| 在线播放精品| 亚洲综合日韩中文字幕v在线| 亚洲狠狠丁香婷婷综合久久久| 欧美精品一区二区在线播放| 在线中文字幕不卡| 麻豆国产精品777777在线| 久久高清福利视频| 午夜精品美女自拍福到在线| 亚洲精品影院在线观看| 欧美伊人精品成人久久综合97| 欧美在线电影| 欧美日本免费一区二区三区| 日韩一区二区精品在线观看| 国产免费成人| 亚洲精品午夜精品| 久久精品国内一区二区三区| 欧美激情精品久久久久久蜜臀| 99国产精品私拍| 日韩特黄影片| 欧美一级黄色网| 欧美大片在线观看| 欧美日韩中文字幕| 亚洲一区在线视频| 国产在线一区二区三区四区| 亚洲影院色无极综合| 99视频在线精品国自产拍免费观看| 久久―日本道色综合久久| 亚洲精品日日夜夜| 久久精品主播| 国产精品自在在线| 久久综合成人精品亚洲另类欧美| 美女黄网久久| 国产精品盗摄久久久| 欧美精品videossex性护士| 揄拍成人国产精品视频| 久久久www成人免费精品| 国产精品久久久免费| 亚洲精品一区二区在线观看| 欧美视频日韩视频| 欧美在线综合| 亚洲一区二区视频在线| 亚洲日本va在线观看| 久久免费国产| 亚洲精品影院| 最新亚洲电影| 亚洲女人小视频在线观看| 一区二区三区日韩精品| 欧美理论视频| 亚洲欧美日韩天堂| 日韩视频在线一区二区三区| 久久日韩粉嫩一区二区三区| 亚洲欧美变态国产另类| 久久精品日韩欧美| 欧美精品在线观看一区二区| 欧美一级久久| 欧美日韩精品是欧美日韩精品| 午夜精品久久久久久久| 久久婷婷国产综合精品青草| 欧美+亚洲+精品+三区| 亚洲色诱最新| 亚洲字幕在线观看| 欧美日精品一区视频| 国内精品久久久久久影视8| 久久久久国色av免费看影院| 激情视频一区二区| 1769国产精品| 在线欧美亚洲| 亚洲一区二区网站| 亚洲一区成人| 欧美日韩一区二区视频在线观看| 噜噜噜在线观看免费视频日韩| 蜜臀av国产精品久久久久| 久久久久综合| 欧美一区二区私人影院日本| 国产精品欧美日韩一区二区| 久久久人成影片一区二区三区| 免费久久99精品国产自| 欧美mv日韩mv国产网站| 欧美日韩成人| 国产午夜久久| 欧美激情亚洲一区| 久久久www成人免费精品| 国产精品久久久久久久app| 欧美日韩国产小视频在线观看| 欧美日韩午夜在线视频| 久久国产主播| 一本大道久久精品懂色aⅴ| 一区二区三区自拍| 国产精品日日摸夜夜摸av| 欧美日韩精品福利| 一区二区三区在线不卡| 欧美一区二区三区四区在线观看地址| aa日韩免费精品视频一| 99国产精品久久久久久久| 欧美精品国产| 亚洲免费视频中文字幕| 亚洲国内在线| 久久久精品一区二区三区| 亚洲毛片网站| 亚洲自拍偷拍福利| 欧美一级夜夜爽| 国产综合婷婷| 国产乱码精品一区二区三区五月婷| 亚洲欧洲综合另类在线| 久久av一区二区| 国产精品va| 欧美chengren| 你懂的国产精品永久在线| 国产精品高潮视频| 国产一区二区三区在线播放免费观看| 亚洲视频在线一区观看| 国产精品超碰97尤物18| 午夜在线一区二区| 精品动漫3d一区二区三区免费版| 亚洲欧美视频一区二区三区| 欧美日韩伦理在线免费| 欧美在线日韩精品| 亚洲一区二区三区国产| 99视频精品免费观看| 91久久久亚洲精品| 国产日产精品一区二区三区四区的观看方式| 在线电影欧美日韩一区二区私密| 一区二区在线免费观看| 久久免费视频在线| 夜夜狂射影院欧美极品| 欧美日韩一本到| 欧美成人精品h版在线观看| 国产精品欧美激情| 亚洲欧美视频在线观看视频| 国产精品欧美一区喷水| 国产农村妇女精品一区二区| 国产精品国产三级国产专播精品人| 欧美日韩第一区| 亚洲日韩视频| 欧美大片免费观看在线观看网站推荐| 欧美极品欧美精品欧美视频| 国产精品a久久久久| 欧美精品一区二区三区视频| 欧美日韩精品免费观看| 欧美大胆人体视频| 欧美视频日韩视频在线观看| 亚洲欧美日本伦理| 欧美专区在线观看| 国产精品高潮呻吟视频| 亚洲激情一区|