最近一直在弄的那个小程序终于弄好了,起初在学校没好好学,连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;
}