国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

TCP/IP UDP廣播無法發(fā)送或接收

這篇具有很好參考價值的文章主要介紹了TCP/IP UDP廣播無法發(fā)送或接收。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

TCP/IP UDP廣播無法發(fā)送或者接收數(shù)據(jù)

在看《TCP/IP 網(wǎng)絡(luò)編程》這本書的時候,看到廣播那一節(jié),跟著書上寫代碼,怎么寫都不行,廣播就是沒法發(fā)送/接收,發(fā)送端一直在發(fā)送數(shù)據(jù),接收端就是沒有反應(yīng)。

對了好幾遍源碼,沒有問題。實在是愁人。

最后查了很多資料,確定是網(wǎng)卡的問題。

現(xiàn)在的計算機(jī)都是多網(wǎng)卡,至少是有線+無線網(wǎng)卡,如果安裝了虛擬機(jī)的話,還會有虛擬網(wǎng)卡。

廣播地址無法區(qū)分網(wǎng)卡,只能按照默認(rèn)網(wǎng)卡優(yōu)先級發(fā)送,這就導(dǎo)致我們的數(shù)據(jù)沒有走那個我們需要的網(wǎng)卡發(fā)送出去。進(jìn)而導(dǎo)致收不到數(shù)據(jù)。

解決辦法

  1. 禁用一些網(wǎng)卡,將用不到的網(wǎng)卡全部禁用掉
  2. 在代碼里添加綁定IP地址的邏輯,綁定到具體的網(wǎng)卡IP

我是用的是第2種方式,比較方便靈活。

發(fā)送端Linux源碼:

#include <arpa/inet.h>
#include <asm-generic/socket.h>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <iostream>
#include <iterator>
#include <linux/in.h>
#include <sys/endian.h>
#include <sys/socket.h>
#include <unistd.h>

#ifndef FILEPATH
#define FILEPATH "../news.txt"
#endif

constexpr int BUF_SIZE = 30;

int main(int argc, char* argv[])
{
    if (argc != 4) {
        std::cout << "Usage: " << argv[0] << "<Self IP> <Boardcast IP> <PORT>" << std::endl;
        return 0;
    }

    int send_socket = socket(PF_INET, SOCK_DGRAM, 0);

    // 綁定到具體的網(wǎng)卡IP
    sockaddr_in self_adr;
    std::memset(&self_adr, 0, sizeof(self_adr));
    self_adr.sin_family = AF_INET;
    self_adr.sin_addr.s_addr = inet_addr(argv[1]);
    self_adr.sin_port = 0; // 隨機(jī)分配一個端口
    int res = bind(send_socket, (sockaddr*)&self_adr, sizeof(self_adr));
    if (res == -1) {
        std::cout << "bind error";
    }

    sockaddr_in broad_adr;
    std::memset(&broad_adr, 0, sizeof(broad_adr));
    broad_adr.sin_family = AF_INET;
    broad_adr.sin_addr.s_addr = inet_addr(argv[2]);
    broad_adr.sin_port = htons(std::atoi(argv[3]));

    int so_brd = 1;
    int rtn = setsockopt(send_socket, SOL_SOCKET, SO_BROADCAST, &so_brd, sizeof(so_brd));
    if (rtn == -1) {
        std::cout << "setsockopt error" << std::endl;
        return 0;
    }

    std::ifstream fi { FILEPATH };
    while (!fi.eof()) {
        std::string msg;
        fi >> msg;
        int s = sendto(send_socket, msg.c_str(), msg.size(), 0, (sockaddr*)&broad_adr, sizeof(broad_adr));
        std::cout << s << ":" << msg << std::endl;
        sleep(2);
    }

    close(send_socket);

    return 0;
}


接收端Linux源碼:

#include <arpa/inet.h>
#include <cstring>
#include <iostream>
#include <linux/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>

constexpr int BUF_SIZE = 30;

int main(int argc, char* argv[])
{
    if (argc != 2) {
        std::cout << "Usage: " << argv[0] << " <PORT>" << std::endl;
        return 0;
    }

    int recv_sock = socket(PF_INET, SOCK_DGRAM, 0);

    sockaddr_in adr;
    std::memset(&adr, 0, sizeof(adr));
    adr.sin_family = AF_INET;
    adr.sin_addr.s_addr = htonl(INADDR_ANY);
    int port = std::atoi(argv[1]);
    adr.sin_port = htons(port);
    std::cout << "PORT: " << port << std::endl;

    int rtn = bind(recv_sock, (sockaddr*)&adr, sizeof(adr));
    if (rtn == -1) {
        std::cout << "bind error" << std::endl;
        return 0;
    }

    char buf[BUF_SIZE] = { 0 };
    while (true) {
        sockaddr_in src_adr;
        socklen_t sl = 0;
        int l = recvfrom(recv_sock, buf, BUF_SIZE - 1, 0, (sockaddr*)&src_adr, &sl);
        std::string srcIp = inet_ntoa(src_adr.sin_addr);
        std::cout << srcIp << " - ";
        if (l < 0) {
            break;
        }
        buf[l] = 0;
        std::cout << buf;
    }

    close(recv_sock);

    return 0;
}


接收端Win源碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-763660.html

#include <WS2tcpip.h>
#include <WinSock2.h>
#include <cstdlib>
#include <cstring>
#include <iostream>

constexpr int BUF_SIZE = 30;

int main(int argc, char* argv[])
{
    if (argc != 2) {
        std::cout << "Usage: " << argv[0] << " <PORT>" << std::endl;
        return 0;
    }

    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        std::cout << "WSA error" << std::endl;
        return 0;
    }

    SOCKET recvSock = socket(PF_INET, SOCK_DGRAM, 0);
    SOCKADDR_IN adr;
    std::memset(&adr, 0, sizeof(adr));
    adr.sin_family = AF_INET;
    adr.sin_addr.s_addr = htonl(INADDR_ANY);
    int port = std::atoi(argv[1]);
    adr.sin_port = htons(port);

    int rtn = bind(recvSock, (SOCKADDR*)&adr, sizeof(adr));
    if (rtn == SOCKET_ERROR) {
        std::cout << "bind error" << std::endl;
        return 0;
    }

    std::cout << "服務(wù)已啟動:" << port << std::endl;

    char buf[BUF_SIZE] = { 0 };
    while (true) {
        int strLen = recvfrom(recvSock, buf, BUF_SIZE - 1, 0, nullptr, 0);
        if (strLen < 0) {
            break;
        }
        buf[strLen] = 0;
        std::cout << buf << std::endl;
    }

    closesocket(recvSock);
    WSACleanup();

    return 0;
}

到了這里,關(guān)于TCP/IP UDP廣播無法發(fā)送或接收的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java網(wǎng)絡(luò)編程之IP,端口號,通信協(xié)議(UDP,TCP)

    Java網(wǎng)絡(luò)編程之IP,端口號,通信協(xié)議(UDP,TCP)

    ① C/S :客戶端/服務(wù)器 在用戶本地需要下載安裝客戶端程序,在遠(yuǎn)程有一個服務(wù)器端程序。 優(yōu)點:畫面精美,用戶體驗好 缺點:用戶需要下載更新 ② B/S :瀏覽器/服務(wù)器 只需要一個瀏覽器,用戶通過指定網(wǎng)址訪問對應(yīng)的服務(wù)器。 優(yōu)點:不需要開發(fā)客戶端,只需要頁面+服務(wù)

    2024年02月03日
    瀏覽(97)
  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于UDP的服務(wù)器端/客戶端

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于UDP的服務(wù)器端/客戶端

    目錄 1--TCP和UDP的主要區(qū)別 2--基于 UDP 的數(shù)據(jù) I/O 函數(shù) 3--基于 UDP 的回聲服務(wù)器端/客戶端 4--UDP客戶端Socket的地址分配 5--UDP存在數(shù)據(jù)邊界 6--UDP已連接與未連接的設(shè)置 ① TCP 提供的是可靠數(shù)據(jù)傳輸服務(wù),而 UDP 提供的是不可靠數(shù)據(jù)傳輸服務(wù); ② UDP 在結(jié)構(gòu)上比 TCP 更簡潔,其不會

    2024年02月09日
    瀏覽(53)
  • C/C++ Socket UDP 廣播消息的發(fā)送與接收

    C/C++ Socket UDP 廣播消息的發(fā)送與接收

    局域網(wǎng)內(nèi)全網(wǎng)段廣播消息的IP地址為:255.255.255.255,向該IP地址發(fā)送廣播消息,局域網(wǎng)下的任何網(wǎng)段的客戶機(jī)都能收到廣播。 對于發(fā)送端,如果你只想給某個特定的網(wǎng)段發(fā)送消息,例如你的IP地址為192.168.31.107,那么你的廣播地址是192.168.31.255,向該廣播地址發(fā)送廣播消息,只

    2024年02月12日
    瀏覽(24)
  • 網(wǎng)絡(luò)編程-UDP協(xié)議(發(fā)送數(shù)據(jù)和接收數(shù)據(jù))

    網(wǎng)絡(luò)編程-UDP協(xié)議(發(fā)送數(shù)據(jù)和接收數(shù)據(jù))

    需要了解TCP協(xié)議的,可以看往期文章 https://blog.csdn.net/weixin_43860634/article/details/133274701 通過此圖,可以了解UDP所在哪一層級中 發(fā)送數(shù)據(jù) 接收數(shù)據(jù) 運行效果 1、 UDP是面向無連接通信協(xié)議 (通俗一點講,就是不管是否已連接成功,直接發(fā)送數(shù)據(jù)),該特性正好與TCP協(xié)議相反,

    2024年02月07日
    瀏覽(27)
  • Java netty發(fā)送接收(TCP、UDP)

    最下方附項目地址 項目地址 https://gitee.com/xn-mg/netty_kafka

    2024年02月16日
    瀏覽(20)
  • Linux 下 nc 發(fā)送接收 udp、tcp數(shù)據(jù)

    Linux 下 nc 發(fā)送接收 udp、tcp數(shù)據(jù)

    nc,全名叫 netcat,它可以用來完成很多的網(wǎng)絡(luò)功能,譬如端口掃描、建立TCP/UDP連接,數(shù)據(jù)傳輸、網(wǎng)絡(luò)調(diào)試等等,因此,它也常被稱為網(wǎng)絡(luò)工具的 瑞士軍刀 。 一、只服務(wù)端使用nc 備注:這種方式只能發(fā)送一次數(shù)據(jù),不能互相發(fā)送 1、udp發(fā)送接收數(shù)據(jù),udp本質(zhì)不區(qū)分客戶端服務(wù)

    2024年02月16日
    瀏覽(22)
  • android開發(fā):獲取手機(jī)IP和UDP廣播

    ? ? ? ? UDP廣播在通訊雙方互相不知道對方IP的情況下很有用。這種情形我們也可以用遍歷網(wǎng)段來實現(xiàn),但是比較粗暴,如果網(wǎng)段比較大,不是最多256臺主機(jī)的C類網(wǎng)段的話,很難做遍歷。 ? ? ? ? UDP廣播是解決這種問題的標(biāo)準(zhǔn)方案。 ? ? ? ? 注意,廣播和多播是不同的,廣

    2024年02月19日
    瀏覽(18)
  • 生產(chǎn)服務(wù)器突然本機(jī)無法訪問本機(jī)IP的端口

    生產(chǎn)服務(wù)器突然本機(jī)無法訪問本機(jī)IP的端口

    ????????生產(chǎn)服務(wù)器突然無法訪問自己本機(jī)IP地址的端口,通過localhost或者127.0.0.1都可以正常訪問 ????????服務(wù)器是搭建在虛擬機(jī)上面,起初由于服務(wù)器內(nèi)存不足的原因,導(dǎo)致了服務(wù)器故障無法連接上,后重啟了服務(wù)器,由于搭建的應(yīng)用較多,而且存在應(yīng)用間互相調(diào)用

    2024年02月14日
    瀏覽(23)
  • 【TCP/IP】廣播 - 定義、原理及編程實現(xiàn)

    【TCP/IP】廣播 - 定義、原理及編程實現(xiàn)

    ????????本文共計2974字,預(yù)計閱讀時間4分鐘 目錄 廣播 廣播的原理及形式 廣播的編程與實現(xiàn) 套接字選項設(shè)置 發(fā)送者 接收者 拓展資料 ??????? ?廣播(Broadcast)是指封包在計算機(jī)網(wǎng)絡(luò)中傳輸時,目的地址為網(wǎng)絡(luò)中所有設(shè)備的一種傳輸方式。 這里所說的“所有設(shè)備”也被

    2024年02月12日
    瀏覽(19)
  • 《TCP IP網(wǎng)絡(luò)編程》

    《TCP IP網(wǎng)絡(luò)編程》

    ? ? ? ? 2023.6.28 正式開始學(xué)習(xí)網(wǎng)絡(luò)編程。 每一章每一節(jié)的筆記都會記錄在博客中以便復(fù)習(xí)。 ? ? ? ? 網(wǎng)絡(luò)編程又叫套接字編程。所謂網(wǎng)絡(luò)編程,就是編寫程序使兩臺連網(wǎng)的計算機(jī)相互交換數(shù)據(jù)。 為什么叫套接字編程? 我們平常將插頭插入插座上就能從電網(wǎng)中獲取電力,同

    2024年02月11日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包