linux网络编程之广播

Linux网络编程之广播作者:Eric(wongpz@foxmail.com)时间:2012-09-14

常见的TCP和UDP通信大都使用的是点对点的单播方式,这种方式可以很方便进行交互处理,香港虚拟主机,在多个交互同时进行时,网络带宽占的比较多。广播是由一个主机向一个网络上所有主机发送消息的方式,需要的网络带宽相对单播来说,降低很多。广播的地址是将IP地址中主机部分全部置为1,即xxx.xxx.xxx.255。255.255.255.255这一特殊的广播地址可以向全世界进行广播,但一般路由器都会屏蔽。广播发送的目的MAC地址为FF:FF:FF:FF:FF:FF。一般发送广播步骤如下:(1)确定广播接口名字,香港虚拟主机,如eth0;(2)确定广播地址,通过ioctl函数,请求码为SIOCGIFBRDADDR,从而得到广播地址;(3)使用广播地址进行广播;由于TCP协议是端到端的协议,通信之前必须建立三次握手才能发送数据,美国服务器,而广播是一种一对多的通信方式,所以TCP不支持广播。一般在局域网中,广播用来探测服务器地址或客户端的发现。编程实现:服务器端:

/********************************************************************* * Filename: bcast_server.c * Description: 广播服务器端代码 * Author: Eric(wongpz@foxmail.com) * Date: 2012-9-14 ********************************************************************/#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <fcntl.h>#include <linux/in.h>#include <stdlib.h>#define IP_FOUND “IP_FOUND”#define IP_FOUND_ACK “IP_FOUND_ACK”#define PORT 9999int main(int argc, char*argv[]){int ret = -1;int sock;sockaddr_in from_addr; from_len = sizeof(struct sockaddr_in);int count = -1;fd_set readfd; buffer[1024];struct timeval timeout;timeout.tv_sec = 2;timeout.tv_usec = 0;sock = socket(AF_INET, SOCK_DGRAM, (sock < 0){perror();return -1;}memset((void*) &server_addr, 0, sizeof(struct sockaddr_in));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htons(INADDR_ANY );server_addr.sin_port = htons(PORT);//将地址结构绑定到套接字上ret = bind(sock, (struct sockaddr*) &server_addr, sizeof(server_addr));if (ret < 0){perror();return -1;}/*** 循环等待客户端*/while (1){timeout.tv_sec = 100;timeout.tv_usec = 0;//文件描述符集合清0FD_ZERO(&readfd);//将套接字描述符加入到文件描述符集合FD_SET(sock, &readfd);//select侦听是否有数据到来ret = (ret){case -1: //发生错误perror();break;printf();break;default:if (FD_ISSET(sock,&readfd)){count = recvfrom(sock, buffer, 1024, 0,(struct sockaddr*)&from_addr, &from_len); //接收客户端发送的数据 (strstr(buffer, IP_FOUND)){//响应客户端请求//打印客户端的IP地址和端口号printf(,(char *)inet_ntoa(from_addr.sin_addr),ntohs(from_addr.sin_port));//将数据发送给客户端memcpy(buffer, IP_FOUND_ACK, strlen(IP_FOUND_ACK) + 1);count = sendto(sock, buffer, strlen(buffer), 0,(struct sockaddr*) &from_addr, from_len);}}break;}}return 0;}而是他们在同伴们都睡着的时候,一步步艰辛地

linux网络编程之广播

相关文章:

你感兴趣的文章:

标签云: