




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SOCKET之UDP跨网段广播返回服务端主机名和所有IP/ myudpclient.cpp : 定义控制台应用程序的入口点。/#pragma once#include stdafx.h#include targetver.h#include #include #include #include #include #include /#include /#include /#include /#include /#include #pragma comment ( lib, ws2_32.lib )#include using namespace std;#define MAXLINE 1024#define SERV_PORT 4000void ShowMessage(char *buff)/处理接受到的报文char arrayINFO10MAXLINE=0;/存放数据的数组,第一个为返回的客户端名称,若与本机名称相同,则接收。第二个为服务端名称,其后为其IPint j=0,k=0;int i; for(i = 0;buffi;i+)if(buffi=?)strncpy(arrayINFOj,&buffk,i-k);k=i+1;j+;strncpy(arrayINFOj,&buffk,i);char localHostNameMAXLINE=0;gethostname(localHostName,MAXLINE);if(strcmp(localHostName,arrayINFO0)=0)coutendl服务器主机名:arrayINFO1 接受到数据,其共有j-1个IPendl;for(int temi=1;temij;temi+)cout第temi个ip :arrayINFOtemi+1endl; int main()WSADATA wsaData;if (WSAStartup(MAKEWORD(2,2),&wsaData)!=NO_ERROR)std:coutInitialization failedstd:endl;elsecoutinitialization successendl;/创建UDP的套接字SOCKET socket1=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);if(INVALID_SOCKET = socket1) coutsocket errorendl;elsecoutsocket successendl; / 用来发送和接收数据 struct sockaddr_in client;client.sin_family = AF_INET; client.sin_port = htons(4000); client.sin_addr.s_addr = INADDR_BROADCAST;/client.sin_addr.S_un.S_addr = inet_addr(255.255.255.255);/和上面一条语句一个意思,不过要对应好子网掩码/设置该套接字为广播类型, bool bOpt = true; setsockopt(socket1,SOL_SOCKET,SO_BROADCAST,(char*)&bOpt,sizeof(bOpt); int nAddrLen = sizeof(SOCKADDR); char buffMAXLINE = ; int nLoop = 0; int err;while(1) /广播一条消息char localHostNameMAXLINE=0;gethostname(localHostName,MAXLINE);char SendMesMAXLINE=0;coutendl请输入需要传输的数据:;cin.getline(SendMes,MAXLINE,n);strcat(localHostName,?);strcat(localHostName,SendMes);/将本主机信息和发送的信息绑定到一个数组/coutIP发送前inet_ntoa(client.sin_addr)endl;int nSendSize = sendto(socket1,localHostName,strlen(localHostName),0,(SOCKADDR*)&client,sizeof(SOCKADDR);if(SOCKET_ERROR = nSendSize)err = WSAGetLastError(); coutsend 主机名 error!, error code iserrendl; elsecout发送成功endl;/coutIP发送后inet_ntoa(client.sin_addr)endl;/发送前发送后不变/等待客户端返回其主机名和IP/设置超时信息int nTimeOut = 1500 ; setsockopt(socket1,SOL_SOCKET,SO_RCVTIMEO,(char *)&nTimeOut,sizeof(int);while(1)char buff1024=0;recvfrom(socket1,buff,MAXLINE,0,(SOCKADDR*)&client,&nAddrLen); client.sin_addr.s_addr = INADDR_BROADCAST;if(strlen(buff)=0)/printf(接收超时!); break;elseShowMessage(buff);client.sin_addr.s_addr = INADDR_BROADCAST;/须重新初始化广播地址,不然其会记录为上一次发送的地址,就不再sendto广播了/while1结束/ myudpserver.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#pragma comment ( lib, ws2_32.lib )#include using namespace std;#define MAXLINE 1024#define SERV_PORT 4000void GetInfo(char* SendInfo)/取得本地计算机名和IPchar localHostNameMAXLINE=0;gethostname(localHostName,MAXLINE);/根据计算机名取得所有IPstrcat(SendInfo,localHostName);hostent* pHostent = gethostbyname(localHostName);hostent& he=*pHostent; sockaddr_in sa; for (int nAdapter=0; he.h_addr_listnAdapter; nAdapter+) memcpy ( &sa.sin_addr.s_addr, he.h_addr_listnAdapter,he.h_length);LPCSTR ip=inet_ntoa(sa.sin_addr);string strIP;strIP=ip;char localIPMAXLINE=0;strcpy(localIP,strIP.c_str();/将string字符串转化成数组,用localIP存储。strcat(SendInfo,?);strcat(SendInfo,localIP); void ShowMessage(char *buff,char *ClientHName)/处理接受到的报文char arrayINFO2MAXLINE=0;/存放数据的数组,第一个为主机名,第二个消息int j=0,k=0;int i; for(i = 0;buffi;i+)if(buffi=?)strncpy(arrayINFO0,buff,i);break;strncpy(arrayINFO1,&buffi+1,strlen(buff);cout接受到arrayINFO0发来的消息:arrayINFO1endl;strcat(ClientHName,arrayINFO0);int main()WSADATA wsaData;if (WSAStartup(MAKEWORD(2,2),&wsaData)!=NO_ERROR)std:coutInitialization failedstd:endl;elsecoutinitialization successendl;/创建socketSOCKET socket1=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);if(socket1=INVALID_SOCKET)coutsocket failendl;else coutsocket successendl;/设置该套接字为广播类型 bool bOpt = true; / 用来绑定套接字struct sockaddr_in server;server.sin_family=AF_INET;server.sin_port=htons(4000); /监听端口/server.sin_addr.s_addr = 0;server.sin_addr.s_addr = htonl(INADDR_ANY);setsockopt(socket1,SOL_SOCKET,SO_BROADCAST,(char*)&bOpt,sizeof(bOpt);/绑定套接字if(bind(socket1,(struct sockaddr*)&server,sizeof(SOCKADDR)=-1) coutbind failendl;else coutbind successendl;/取得本机信息char SendInfoMAXLINE=0;GetInfo(SendInfo);/ 用来发送和接收数据 struct sockaddr_in client;client.sin_family = AF_INET; client.sin_port = htons(4000); client.sin_addr.s_addr = INADDR_BROADCAST; /int err; int nAddrLen = sizeof(SOCKADDR); while(1) char buffMAXLINE=0;char ClientHNameMAXLINE=0;/客户端主机名cout正在监听.endl;/接收客户端传来的消息if(recvfrom(socket1,buff,MAXLINE,0,(SOCKADDR*)&client,&nAddrLen)!=SOCKET_ERROR)ShowMessage(buff,ClientHName);client.sin_addr.s_addr = INADDR_BROADCAST;/没有这句话的话,sendto不能跨到其他网段。意思是必须得广播才能跨网段/strcat(SendInfo,ClientHName);/将客户端主机名并入SendInfo数组strcat(ClientHName,?);strcat(ClientHName,SendInfo);/将客户端主机名并入ClientHName数组,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州台江县民族中医院第二次招聘备案制专业技术人员考前自测高频考点模拟试题及答案详解(名师系列)
- 2025年应急管理部所属单位第二批次招聘185人考前自测高频考点模拟试题有答案详解
- 2025江西赣州市市直医疗卫生单位及赣州市立医院招聘专业技术人员389人模拟试卷(含答案详解)
- 2025江苏盐城市急救医疗中心招录政府购买服务用工1人模拟试卷及答案详解(各地真题)
- 2025江苏泰州学院招聘专职辅导员和专任教师17人考前自测高频考点模拟试题附答案详解(黄金题型)
- 2025年商洛丹源电力(集团)有限责任公司招聘(2人)考前自测高频考点模拟试题完整参考答案详解
- 2025年中国滑雪双肩包行业市场分析及投资价值评估前景预测报告
- 2025年中国户外遮阳窗行业市场分析及投资价值评估前景预测报告
- 2025黑龙江东北林业大学土木与交通学院派遣人才招聘1人模拟试卷附答案详解(黄金题型)
- 2025湖北鄂州华容区城市建设投资有限公司面向社会招聘4人模拟试卷及答案详解(全优)
- 2025贵州黔西南州州直事业单位面向全州考聘工作人员84人考试参考试题及答案解析
- 肉鸡屠宰行业安全培训课件
- DB11-T 2477-2025 洗染企业服务评价规范
- 墩柱安全教育培训课件
- 新版中华民族共同体概论课件第十五讲新时代与中华民族共同体建设(2012- )-2025年版
- 2025年全国《家庭教育指导师》考试模拟试题(附答案)
- 建筑工程检测机构管理制度、设备操作规程、自校准规程(含技术记录)及检测作业指导书2025版
- 2026届房山区高三开学考试语文试题及参考答案
- 珠海市金湾区园洲岛海洋牧场养殖区项目环境影响报告书
- 街道社区安全培训内容课件
- 桡骨骨折复位内固定术
评论
0/150
提交评论