SOCKET之UDP跨网段广播返回服务端主机名和所有IP.doc_第1页
SOCKET之UDP跨网段广播返回服务端主机名和所有IP.doc_第2页
SOCKET之UDP跨网段广播返回服务端主机名和所有IP.doc_第3页
SOCKET之UDP跨网段广播返回服务端主机名和所有IP.doc_第4页
SOCKET之UDP跨网段广播返回服务端主机名和所有IP.doc_第5页
已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论