udp_finder

博客围绕UDP发现设备展开,但具体内容缺失。UDP发现设备是信息技术领域用于设备发现的一种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//UDP 发送广播信息 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
 
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
 #define        HEADER_FINDER     "{\"tp\":1001}"  



void *localprint_udp_handle(void *arg)
{	
    struct sockaddr_in from;
    int sockfd = -1;
    int ret;
    int len;
    int recvlen;
    char rec_buf[1024];
    struct sockaddr_in addr_cli;
    //int opt = 0;
    int port = *(int*)arg;

    
	bzero(&from, sizeof(struct sockaddr_in));  
	from.sin_family = AF_INET;	
	from.sin_addr.s_addr = htonl(INADDR_ANY);
	//from.sin_addr.s_addr = htonl(INADDR_BROADCAST);
	from.sin_port = htons(port);  
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if (sockfd == -1) 
	{	  
		printf("[UDP]:Error(socket error)\n");	
		return NULL;
	}  
    #if 0
	ret = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (char*)&opt, sizeof(opt)); 
	if(ret == -1)
	{  
		printf("[UDP]:Error(set socket error)\n");	
		return NULL;  
	}  
    #endif

	ret = bind(sockfd,(struct sockaddr *)&(from), sizeof(struct sockaddr_in));
	if(ret == -1)	
	{
		printf("bind error:%s<%s>, %d, \n", strerror(errno), __FUNCTION__, __LINE__);
		return NULL;
	}
    while(1) {
		len = sizeof(struct sockaddr);
		memset(rec_buf, 0, sizeof(rec_buf));
		memset(&addr_cli, 0, sizeof(struct sockaddr_in));
		
		recvlen = recvfrom(sockfd, rec_buf, sizeof(rec_buf), 0, (struct sockaddr*)&addr_cli, &len);   

        if(recvlen <= 0) {  
            printf("read error....\n");  
        } else {  
            printf("len:%d, receive here:%s, %d\n", recvlen, inet_ntoa(addr_cli.sin_addr), ntohs(addr_cli.sin_port));
            printf("recieve:0x%x, 0x%x, %d, <%s>\n", rec_buf[0], rec_buf[1], *((int*)&rec_buf[2]), &rec_buf[6]);     
        } 

    }
}
int main(int argc, char *argv[])
{
    char brocastaddr[50] = {0};
    int port;
    int ret;
    pthread_t pthread_udp;
    if(argc == 2) {
        //INADDR_BROADCAST
        strcpy(brocastaddr, "255.255.255.255");   
        //strcpy(brocastaddr, "192.168.7.255");
        //接收端口号并转换为int
	    port = atoi(argv[1]);
    } else 	if(argc == 3) {
        strcpy(brocastaddr, argv[1]); 
        port = atoi(argv[2]);
    } else {
		printf("please input ip and port\n");
		return -1;
	} 


    ret = pthread_create(&pthread_udp, NULL, localprint_udp_handle, &port);


    
	if( port<1025 || port>65535 )//0~1024一般给系统使用,一共可以分配到65535
	{
		printf("port should be 1025~65535");
		return -1;
	}
	
	//1.创建UDP  socket 
    int udp_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (udp_socket_fd == -1)
    {
        printf("create socket failed ! error message :%s\n", strerror(errno));
        return -1;
    }
		
	
	//2.开启发送广播数据功能
	int on = 1; //开启
	ret = setsockopt(udp_socket_fd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
	if(ret < 0)
	{
		perror("setsockopt fail\n");
		return -1;
	}

	
	//3.设置当前网段的广播地址 
    struct sockaddr_in bro_addr = {0};
    bro_addr.sin_family = AF_INET;
    bro_addr.sin_port = htons(port);
    bro_addr.sin_addr.s_addr = inet_addr(brocastaddr);  //设置为广播地址




    char rec_buf[1024] = {0};
	char send_buf[1024] = {0xbc, 0x01};//消息缓冲区
    int *size = (int*)&send_buf[2];
    *size = strlen(HEADER_FINDER);
	strcpy(&send_buf[6], HEADER_FINDER);

    struct sockaddr_in addr_cli = {0};
    socklen_t len;


    
	//4 发送数据  
	while(1)
	{

		len = sendto(udp_socket_fd, send_buf, strlen(HEADER_FINDER) + 6 + 1, 0, (struct sockaddr *)&bro_addr, sizeof(bro_addr)); 
        //printf("len:%d, receive here:%s, %d\n", len, inet_ntoa(bro_addr.sin_addr), ntohs(bro_addr.sin_port));
        
        len = sizeof(struct sockaddr);
        bzero(rec_buf, sizeof(rec_buf));
        memset(&addr_cli, 0, sizeof(addr_cli));
        //ret = recv(udp_socket_fd, rec_buf, sizeof(rec_buf), 0);
        

        //ret = recvfrom(udp_socket_fd, rec_buf, sizeof(rec_buf), 0, (struct sockaddr *)&addr_cli,&len);  
        printf("len:%d\n", ret);
 
        sleep(2);
	}
	
	
	//5.关闭网络通信
	close(udp_socket_fd);
	
	return 0;
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值