一般做网站是用什么程序做的,网站添加百度地图,上海网络推广报价,站长统计代码TCP/IP UDP广播无法发送或者接收数据
在看《TCP/IP 网络编程》这本书的时候#xff0c;看到广播那一节#xff0c;跟着书上写代码#xff0c;怎么写都不行#xff0c;广播就是没法发送/接收#xff0c;发送端一直在发送数据#xff0c;接收端就是没有反应。
对了好几遍…TCP/IP UDP广播无法发送或者接收数据
在看《TCP/IP 网络编程》这本书的时候看到广播那一节跟着书上写代码怎么写都不行广播就是没法发送/接收发送端一直在发送数据接收端就是没有反应。
对了好几遍源码没有问题。实在是愁人。
最后查了很多资料确定是网卡的问题。
现在的计算机都是多网卡至少是有线无线网卡如果安装了虚拟机的话还会有虚拟网卡。
广播地址无法区分网卡只能按照默认网卡优先级发送这就导致我们的数据没有走那个我们需要的网卡发送出去。进而导致收不到数据。
解决办法
禁用一些网卡将用不到的网卡全部禁用掉在代码里添加绑定IP地址的逻辑绑定到具体的网卡IP
我是用的是第2种方式比较方便灵活。
发送端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
#endifconstexpr 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);// 绑定到具体的网卡IPsockaddr_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; // 随机分配一个端口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.hconstexpr 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源码
#include WS2tcpip.h
#include WinSock2.h
#include cstdlib
#include cstring
#include iostreamconstexpr 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 服务已启动 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;
}