已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 21956.1-2024农林拖拉机窄轮距轮式拖拉机翻滚防护装置第1部分:前置式
- 关于马的教案5篇
- 进行性核上性眼肌麻痹个案护理
- LOGO著作权转让协议书
- 江阴居住型租房协议
- 河南省豫东名校2021-2022学年高一下学期第三次联考地理试题(含答案解析)
- 新译林 5B 五下U1 Ciderella 听力和语法练习
- 员工劳动合同封面范本(标准版)
- 五年级上册 口算题1000道
- 服务器巡检报告模版
- 2023肿瘤早筛行业研究报告:原研技术突破已初步验证商业模式C端与出海市场待挖掘-动脉网
- 等差数列说课课件公开课一等奖课件省课获奖课件
- 【生物质能的利用研究12000字(论文)】
- 小学关于科技节主题班会-科技创新主题班会课件
- 大学英语(三)学习通超星课后章节答案期末考试题库2023年
- 幼儿园燃气泄露安全疏散演练方案
- 2023年甘肃省交通厅事业单位面试题及参考答案
- 少先队活动课说课公开课一等奖市优质课赛课获奖课件
- 2023年高考英语二模试题分项汇编-10作文(教师版)(上海)
- 2023年国学智慧题库答案
- 2023春国开电大《实用管理基础》形考任务1-4参考答案
评论
0/150
提交评论