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

2019-07-13 21:58发布

最近一直在弄的那个小程序终于弄好了,起初在学校没好好学,连tcp/ip是什么都不知道,如今终于编好。 这个程序只是用来进行单次的问答设置,更完善的就是将所有的设置指令编为一个个子函数,然后需要用的时候直接调用该子函数即可,就不用一遍一遍输指令了。 电源
本来udp通信是不需要connect的,但是为了偷懒用read和write,以及指令准确送达,还是建议加上。

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


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


主机端:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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 ")==0)                         {                                 printf("结束 ");                                 break;
                        }                         write(sock,wri_buff,strlen(wri_buff));                         memset(buffer,0,sizeof(buffer));                         read(sock,rea_buff,sizeof(rea_buff));                         printf("read:%s ",rea_buff);
        }         close(fd);         return 0;
}