学习笔记
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,操作更方便哦