文章参考:http://www.cnblogs.com/leaven/archive/2012/08/22/2650772.html
Linux 部分:
server代码:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <sys/un.h>
#include<netinet/in.h>
#define IP_FOUND "IP_FOUND" /*IP发现命令*/
#define MCAST_PORT 1333
#define IP_FOUND_ACK "IP_FOUND_ACK" /*IP发现应答命令*/
void HandleIPFound(void*arg)
{
#define BUFFER_LEN 32
int ret = -1;
int sock = -1;
struct sockaddr_in local_addr; /*本地地址*/
struct sockaddr_in from_addr; /*客户端地址*/
int from_len;
int count = -1;
fd_set readfd;
char buff[BUFFER_LEN] = {0};
struct timeval timeout;
timeout.tv_sec = 2; /*超时时间2s*/
timeout.tv_usec = 0;
printf("==>HandleIPFound\n");
sock = socket(AF_INET, SOCK_DGRAM, 0); /*建立数据报套接字*/
if( sock < 0 )
{
printf("HandleIPFound: socket init error\n");
return;
}
/*数据清零*/
memset((void*)&local_addr, 0, sizeof(struct sockaddr_in));
/*清空内存内容*/
local_addr.sin_family = AF_INET; /*协议族*/
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);/*本地地址*/
local_addr.sin_port = htons(MCAST_PORT); /*侦听端口*/
/*绑定*/
ret = bind(sock, (struct sockaddr*)&local_addr, sizeof(local_addr));
if(ret != 0)
{
printf("HandleIPFound:bind error\n");
return;
}
/*主处理过程*/
while(1)
{
/*文件描述符集合清零*/
FD_ZERO(&readfd);
/*将套接字文件描述符加入读集合*/
FD_SET(sock, &readfd);
/*select侦听是否有数据到来*/
ret = select(sock+1, &readfd, NULL, NULL, &timeout);
switch(ret)
{
case -1:
/*发生错误*/
break;
case 0:
/*超时*/
//超时所要执行的代码
break;
default:
/*有数据到来*/
if( FD_ISSET( sock, &readfd ) )
{
/*接收数据*/
count = recvfrom( sock, buff, BUFFER_LEN, 0,( struct sockaddr*) &from_addr, &from_len );
printf( "Recv msg is %s\n", buff );
if( strstr( buff, IP_FOUND ) )
/*判断是否吻合*/
{
/*将应答数据复制进去*/
memcpy(buff, IP_FOUND_ACK,strlen(IP_FOUND_ACK)+1);
/*发送给客户端*/
count = sendto( sock, buff, strlen( buff ),0, ( struct sockaddr*) &from_addr, from_len );
}
}
}
}
printf("<==HandleIPFound\n");
return;
}
void main()
{
HandleIPFound(NULL);
}
client部分:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<netinet/in.h>
#include<net/if.h>
#include<sys/ioctl.h>
#include <arpa/inet.h>
#define IP_FOUND "IP_FOUND" /*IP发现命令*/
#define IP_FOUND_ACK "IP_FOUND_ACK" /*IP发现应答命令*/
#define IFNAME "eth0"
#define MCAST_PORT 1333
#define BUFFER_LEN 32
char buff[BUFFER_LEN] = {0};
void IPFound(void*arg)
{
int ret = -1;
int sock = -1;
int so_broadcast = 1;
struct ifreq ifr;
struct sockaddr_in broadcast_addr; /*本地地址*/
struct sockaddr_in from_addr; /*服务器端地址*/
int from_len;
int count = -1;
fd_set readfd;
struct timeval timeout;
timeout.tv_sec = 5; /*超时时间2s*/
timeout.tv_usec = 0;
sock = socket(AF_INET, SOCK_DGRAM, 0);/*建立数据报套接字*/
if( sock < 0 )
{
printf("HandleIPFound: socket init error\n");
return;
}
/*将需要使用的网络接口字符串名字复制到结构中*/
strncpy(ifr.ifr_name,IFNAME,strlen(IFNAME));
/*发送命令,获取网络接口的广播地址*/
if(ioctl(sock,SIOCGIFBRDADDR,&ifr) == -1)
perror("ioctl error"),exit(1);
/*将获得的广播地址复制给变量broadcast_addr*/
memcpy(&broadcast_addr, &ifr.ifr_broadaddr, sizeof(struct
sockaddr_in ));
broadcast_addr.sin_port = htons(MCAST_PORT);/*设置广播端口*/
/*设置套接字文件描述符sock为可以进行广播操作*/
ret = setsockopt(sock,
SOL_SOCKET,
SO_BROADCAST,
&so_broadcast,
sizeof so_broadcast);
/*主处理过程*/
int times = 10;
int i = 0;
for(i=0; i<times; i++)
{
/*广播发送服务器地址请求*/
printf("IP_FOUND :%s\n",IP_FOUND);
ret = sendto(sock,
IP_FOUND,
strlen(IP_FOUND),
0,
(struct sockaddr*)&broadcast_addr,
sizeof(broadcast_addr));
if(ret == -1)
{
printf("ret :%d\n",ret);
continue;
}
/*文件描述符集合清零*/
FD_ZERO(&readfd);
/*将套接字文件描述符加入读集合*/
FD_SET(sock, &readfd);
/*select侦听是否有数据到来*/
ret = select(sock+1, &readfd, NULL, NULL, &timeout);
switch(ret)
{
case -1:
/*发生错误*/
printf("select :error\n");
break;
case 0:
/*超时*/
//超时所要执行的代码
printf("select :timeout\n");
break;
default:
/*有数据到来*/
if( FD_ISSET( sock, &readfd ) )
{
char *tmp;
/*接收数据*/
count = recvfrom( sock, buff, BUFFER_LEN, 0,
( struct sockaddr*) &from_addr, &from_len );
printf( "Recv msg is %s\n", buff );
//tmp = strstr(buff,IP_FOUND_ACK);
//printf("---------------------------------------------------!!!%s",tmp);
if(NULL != strstr(buff,IP_FOUND_ACK))/*判断是否吻合*/
{
printf("found server, IP is %s\n",inet_ntoa(from_addr.sin_addr));
}
break;/*成功获得服务器地址,退出*/
}
}
}
return;
}
void main()
{
IPFound(NULL);
}
Windows部分:
server部分:
// boardcastserver.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<stdlib.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include <winsock.h>
#include <Windows.h>
#define IP_FOUND "IP_FOUND" /*IP发现命令*/
#define MCAST_PORT 1333
#define IP_FOUND_ACK "IP_FOUND_ACK" /*IP发现应答命令*/
void HandleIPFound(void*arg)
{
#define BUFFER_LEN 32
int ret = -1;
SOCKET sock = -1;
sockaddr_in local_addr; /*本地地址*/
sockaddr_in from_addr; /*客户端地址*/
int from_len = 256;
int count = -1;
fd_set readfd;
char buff[BUFFER_LEN+1] = { 0 };
struct timeval timeout;
timeout.tv_sec = 5; /*超时时间2s*/
timeout.tv_usec = 0;
printf("==>HandleIPFound\n");
//初始化网络环境
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("WSAStartup failed\n");
return ;
}
sock = socket(AF_INET, SOCK_DGRAM, 0); /*建立数据报套接字*/
printf("sock is %d\n", sock);
if (sock < 0)
{
printf("HandleIPFound: socket init error\n");
return;
}
/*数据清零*/
memset((void*)&local_addr, 0, sizeof(struct sockaddr_in));
memset((void*)&from_addr, 0, sizeof(struct sockaddr_in));
/*清空内存内容*/
local_addr.sin_family = AF_INET; /*协议族*/
local_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);/*本地地址*/
local_addr.sin_port = htons(MCAST_PORT); /*侦听端口*/
/*绑定*/
ret = bind(sock, (sockaddr*)&local_addr, sizeof(sockaddr));
if (ret != 0)
{
printf("HandleIPFound:bind error\n");
return;
}
/*主处理过程*/
while (1)
{
/*文件描述符集合清零*/
FD_ZERO(&readfd);
/*将套接字文件描述符加入读集合*/
FD_SET(sock, &readfd);
/*select侦听是否有数据到来*/
ret = select(sock + 1, &readfd, NULL, NULL, &timeout);
switch (ret)
{
case -1:
/*发生错误*/
break;
case 0:
/*超时*/
//超时所要执行的代码
break;
default:
/*有数据到来*/
if (FD_ISSET(sock, &readfd))
{
/*接收数据*/
count = recvfrom(sock, buff, BUFFER_LEN, 0, (struct sockaddr*) &from_addr, &from_len);
//count = recvfrom(sock, buff, BUFFER_LEN, 0, NULL, NULL);
printf("count is %d\n", count);
count = WSAGetLastError();
printf("count is %d\n", count);
printf("Recv msg is %s\n", buff);
printf("found server, IP is %s\n", inet_ntoa(from_addr.sin_addr));
//system("pause");
if (strstr(buff, IP_FOUND))
/*判断是否吻合*/
{
/*将应答数据复制进去*/
memcpy(buff, IP_FOUND_ACK, strlen(IP_FOUND_ACK) + 1);
/*发送给客户端*/
count = sendto(sock, buff, strlen(buff), 0, (struct sockaddr*) &from_addr, from_len);
}
}
}
}
printf("<==HandleIPFound\n");
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("hello world\n");
HandleIPFound(NULL);
system("pause");
return 0;
}