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;}
阅读全文
0 0
- socket 广播小实例
- socket小实例
- Socket通信入门小实例
- 广播实例
- java socket应用的几个小实例
- java Socket客户端服务端通信小实例
- 基于Socket的通信小实例
- C# Socket广播
- socket广播编程
- Socket 实现UDP广播
- socket的局域网广播
- socket之广播
- Socket之广播
- iOS socket udp 广播
- UDP广播socket实现
- socket的局域网广播
- socket 广播问题
- socket的局域网广播
- 从零开始的RxJava2.0教程(四)在安卓中的应用
- 调试TCP网络四元组小工具
- 使用VBO对glVertexAttribPointer的影响
- 线程的互斥锁和死锁问题
- centos支持中文
- socket 广播小实例
- Codeforces 380C Sereja and Brackets
- Mysql 5.7.17 解压版(ZIP版)安装步骤详解
- SQL数据库同步语句,适合直操数据库
- 电影购票APP实现(1)-数据库搭建
- 查询表空间和各个表在空间占内存情况
- 图像处理之矩阵变换Matrix,ColorMatrix
- 点击大头针不弹气泡每次都可以响应点击事件
- Nmap 常用命令总结(思维导图整理)