linux下,使用udp通信协议通过指令控制电源的程序

本文介绍了一个在Linux环境下,使用UDP通信协议控制电源的小程序。程序通过bind和connect实现与电源设备的连接,解决了电源设备绑定端口的问题。主要内容包括创建套接字、设置服务器和本机地址、绑定本机端口以及指令的发送和接收。

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

最近一直在弄的那个小程序终于弄好了,起初在学校没好好学,连tcp/ip是什么都不知道,如今终于编好。

这个程序只是用来进行单次的问答设置,更完善的就是将所有的设置指令编为一个个子函数,然后需要用的时候直接调用该子函数即可,就不用一遍一遍输指令了。

电源

本来udp通信是不需要connect的,但是为了偷懒用read和write,以及指令准确送达,还是建议加上。


实验室的电源比较傻,电源端一旦和客户端链接过一次,就会和第一次链接的端口和地址绑定,而且电源只开放一个端口,那个端口还不能复用。前几次运行程序的时候一直现实connect refused,抓包发现有ICMP报显示目标地址和端口无法使用。程序经老大调教了一番,给我了一个建议,用bind函数绑定本机端口和地址。而我一直以为bind只用于tcp通信的服务器端。。。。。




服务器端的程序就不写了,因为买的大华电源自己就携带有。



主机端:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>

#define SERV_PORT ××××
#define HOST_PORT ××××
#define HOST  "xx.xx.xx.xx"
#define SERV  "xx.xx.xx.xx"


char wri_buff[128];

char rea_buff[128];


int main()
{
        int fd=socket(AF_INET,SOCK_DGRAM,0);            //创建套接字

       

        struct sockaddr_in server_addr;                   //设置服务器端地址

        bzero(&server_addr,sizeof(server_addr));

        server_addr.sin_family=AF_INET;

        server_addr.sin_port=htons(SERV_PORT);

        server_addr.sin_addr.s_addr=inet_addr(SERV);

       

        struct sockaddr_in my_addr;                  //设置本机地址

        bzero(&my_addr,sizeof(my_addr));

       my_addr.sin_family=AF_INET;        

       my_addr.sin_port=htons(HOST_PORT);

       my_addr.sin_addr.s_addr=inet_addr(HOST);

      

       bind(sock,(struct sockaddr*)&my_addr,sizeof(my_addr));          //绑定本机地址

     

       connect(sock,(struct sockaddr*)&server_addr,sizeof(server_addr));              //连接服务器端地址

       

       struct timeval timeOut;              //设置超时

        timeOut.tv_sec=1;

        timeOut.tv_usec=0;

        setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,&timeOut,sizeof(timeOut));

      

        while(1)                 //指令循环收发

        {

                        memset(wri_buff,0,sizeof(wri_buff));

                        fgets(wri_buff,127,stdin);

                        if(strcmp(wri_buff,"quit\n")==0)

                        {

                                printf("结束\n");

                                break;

                        }

                        write(sock,wri_buff,strlen(wri_buff));

                        memset(buffer,0,sizeof(buffer));

                        read(sock,rea_buff,sizeof(rea_buff));

                        printf("read:%s\n",rea_buff);

        }

        close(fd);

        return 0;

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值