socket 广播小实例

来源:互联网 发布:69直播提示网络不给力 编辑:程序博客网 时间:2024/06/06 09:56

文章参考: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    32int 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    32char    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    32int 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;}




原创粉丝点击