赞
踩
学习笔记
client.c
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #include<strings.h> #include<sys/types.h> #include<sys/socket.h> //#include <winsock.h> #include<netinet/in.h> #include<netinet/ip.h> //#include <winsock2.h> #include<errno.h> #define QUIT_STR "quit" #define BACKLOG 5 #define SERV_PORT 5001 #define SERV_IP_ADDR "192.168.109.138" int main(void) { int fd = -1; struct sockaddr_in sin; /* 1: 创建socket */ if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(1); } /*2连接*/ bzero(&sin, sizeof(sin));//清零处理 sin.sin_family = AF_INET; sin.sin_port = htons(SERV_PORT); #if 0 sin.sin_addr.s_addr = inet_addr(SERV_IP_ADDR); #else if (inet_pton(AF_INET, SERV_IP_ADDR, (void*)&sin.sin_addr) != 1) { perror("inet_pton"); exit(1); } #endif if (connect(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0) { perror("connect"); exit(1); } /*3读写数据*/ char buf[BUFSIZ]; while (1) { bzero(buf, BUFSIZ); if (fgets(buf, BUFSIZ - 1, stdin) == NULL) { continue; } write(fd, buf, strlen(buf)); if (!strncasecmp(buf, QUIT_STR, strlen(QUIT_STR))) { printf("client is exiting!\n"); break; } } /*4关闭套接字*/ close(fd); return 0; }
//service.c
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #include<strings.h> #include<sys/types.h> #include<sys/socket.h> //#include <winsock.h> #include<netinet/in.h> //#include <winsock2.h> #include<netinet/ip.h> #include<errno.h> #define QUIT_STR "quit" #define BACKLOG 5 #define SERV_PORT 5001 #define SERV_IP_ADDR "192.168.109.138" int main(void) { int fd = -1; struct sockaddr_in sin; /* 1: 创建socket */ if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(1); } /*2: 绑定 */ /*2.1 填充struct socket_in结构体变量*/ bzero(&sin, sizeof(sin));//清零处理 sin.sin_family = AF_INET; sin.sin_port = htons(SERV_PORT); #if 0 sin.sin_addr.s_addr = inet_addr(SERV_IP_ADDR); #else if (inet_pton(AF_INET, SERV_IP_ADDR, (void *)&sin.sin_addr) != 1) { perror("inet_pton"); exit(1); } #endif /*2.2:绑定*/ if (bind(fd,(struct sockaddr *)&sin,sizeof(sin)) < 0) { perror("bind"); exit(1); } /*3: 调用listen()函数把主动套接字变成被动套接字*/ if (listen(fd, BACKLOG) < 0) { perror("listen"); exit(1); } int newfd = -1; /*4:阻塞等待客户端连接请求*/ newfd = accept(fd, NULL, NULL); if (newfd < 0) { perror("accept"); exit(1); } /*5:读写*/ int ret = -1; char buf[BUFSIZ]; bzero(buf, BUFSIZ); while (1) { do { ret = read(newfd, buf, BUFSIZ - 1); } while (ret < 0 && EINTR == errno); if (ret < 0) { perror("read"); exit(1); } if (0 == ret) //对方已经关闭了 { break; } printf("receive data:%s\n", buf); //if (strncasecmp(buf, QUIT_STR, strlen(QUIT_STR)))//用户输入了quit //{ //printf("client quit!\n"); //break; //} } close(newfd); close(fd); return 0; }
//运行结果如下
//感觉这玩意有点像ROS里的订阅者和发布者。。。通信还有点问题,还没加modbus协议,后面陆续再修改…
//最终源代码
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #include<strings.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netinet/ip.h> #include<errno.h> #include<malloc.h> #define QUIT_STR "quit" #define BACKLOG 5 #define SERV_PORT 5005 #define SERV_IP_ADDR "192.168.109.138" int main(void) { int fd = -1; struct sockaddr_in sin; /* 1: 创建socket */ if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(1); } /*2连接*/ bzero(&sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(SERV_PORT); #if 0 sin.sin_addr.s_addr = inet_addr(SERV_IP_ADDR); #else if (inet_pton(AF_INET, SERV_IP_ADDR, (void*)&sin.sin_addr) != 1) { perror("inet_pton"); exit(1); } #endif if (connect(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0) { perror("connect"); exit(1); } /*3读写数据*/ signed char buf[BUFSIZ]; // char *buf=(char*)malloc(sizeof(char)*512); while (1) { bzero(buf, BUFSIZ); if (fgets(buf, BUFSIZ, stdin) == NULL) { continue; } write(fd, buf, strlen(buf)); } /*4关闭套接字*/ close(fd); return 0; }
//service.c
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #include<strings.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netinet/ip.h> #include<errno.h> #define QUIT_STR "quit" #define BACKLOG 5 #define SERV_PORT 5005 #define SERV_IP_ADDR "192.168.109.138" void modbus();//函数声明 signed char buf[BUFSIZ]; char a[3]; char b[5]; char c[5]; char d[3]; int main(void) { int fd = -1; struct sockaddr_in sin; /* 1: 创建socket */ if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(1); } /*2: 绑定 */ /*2.1 填充struct socket_in结构体变量*/ bzero(&sin, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(SERV_PORT); #if 0 sin.sin_addr.s_addr = inet_addr(SERV_IP_ADDR); #else if (inet_pton(AF_INET, SERV_IP_ADDR, (void *)&sin.sin_addr) != 1) { perror("inet_pton"); exit(1); } #endif /*2.2:绑定*/ if (bind(fd,(struct sockaddr *)&sin,sizeof(sin)) < 0) { perror("bind"); exit(1); } /*3: 调用listen()函数把主动套接字变成被动套接字*/ if (listen(fd, BACKLOG) < 0) { perror("listen"); exit(1); } int newfd = -1; /*4:阻塞等待客户端连接请求*/ newfd = accept(fd, NULL, NULL); if (newfd < 0) { perror("accept"); exit(1); } /*5:读写*/ int ret = -1; while (1) { bzero(buf, BUFSIZ);// do{ ret = read(newfd, buf, BUFSIZ); } while (ret < 0 && EINTR == errno); if (ret < 0) { perror("read"); exit(1); } if (0 == ret) //对方已经关闭了 { break; } modbus(); printf("\n"); } close(newfd); close(fd); return 0; } void modbus() { int k=0,n=0; d[0]=*buf; d[1]=*(buf+1); n=atoi(d); if(n!=01) { printf("地址error\n"); //比较地址,看是否是本机地址,如果不是则退出函数 exit(1); } else { printf("從機地址正確爲%d\n",n); } a[0]=*(buf+2); a[1]=*(buf+3); a[2]='\0'; k=atoi(a);//字符串轉數字 switch(k)//根椐不同的功能嗎做不同的事情。 { case 01: printf("功能馬是01,讀線圈\n"); break; case 02: printf("功能馬是02,讀離散變量\n"); break; case 03: printf("功能馬是03,讀保持寄存器\n"); break; case 04: printf("功能馬是04,讀輸入寄存器\n"); break; case 05: printf("功能馬是05,寫單個線圈\n"); break; case 06: printf("功能馬是06,寫單個寄存器\n");break; case 0x0f: printf("功能馬是0f,寫多個線圈\n"); break; case 16: printf("功能馬是16,寫多個寄存器\n"); break; default:printf("error\n"); break; } b[0]=*(buf+4); b[1]=*(buf+5); b[2]=*(buf+6); b[3]=*(buf+7); b[4]='\0'; printf("數據地址爲%s\n",b); c[0]=*(buf+8); c[1]=*(buf+9); c[2]=*(buf+10); c[3]=*(buf+11); c[4]='\0'; printf("receive data:%s\n",c); /* if('q'==*buf&&'u'==*(buf+1)&&'i'==*(buf+2)&&'t'==*(buf+3))//用户输入了quit { printf("client quit!\n"); // break; } */ }
//报告
链接:https://pan.baidu.com/s/1kul6lwfOfmAOxO6NYtjEgg
提取码:zpek
复制这段内容后打开百度网盘手机App,操作更方便哦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。