1.服务器
#include<sys/socket.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<arpa/inet.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__:",__LINE__);\
perror(msg);\
}while(0)
int main(int argc, const char *argv[])
{
//创建流式套接字
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
//允许端口快速重用
int reuse=1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
{
ERR_MSG("setsockopt");
return -1;
}
//填充ip和端口信息到结构体中
struct sockaddr_in sin;
sin.sin_family = AF_INET; //地址族必须是AF_INET
sin.sin_port = htons(8888); //端口号的网络字节序(1024~49151)
sin.sin_addr.s_addr = inet_addr("192.168.31.109"); //ubuntu 的本机地址,用桥接
//绑定服务器的ip地址和端口
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
{
ERR_MSG("bind");
return -1;
}
//将套接字设置为被动监听状态
if(listen(sfd,128)<0)
{
ERR_MSG("listen");
return -1;
}
printf("listen success\n");
//获取新的文件描述符,该描述符用于通信
struct sockaddr_in a;
int size=sizeof(a);
int newfd = accept(sfd,(struct sockaddr*)&a,&size);
if(newfd<0)
{
ERR_MSG("accept");
return -1;
}
printf("newfd=%d\n",newfd);
printf("ip=%s\n",inet_ntoa(a.sin_addr));
char buf[128]="";
ssize_t res;
while(1)
{
bzero(buf,sizeof(buf));
//接收
res=recv(newfd,buf,sizeof(buf),0);
if(res<0)
{
ERR_MSG("recv");
return -1;
}
if(res==0)
{
printf("对端关闭\n");
break;
}
printf("客户端:%s\n",buf);
//发送
bzero(buf,sizeof(buf));
printf("请输入>>");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
res=send(newfd,buf,sizeof(buf),0);
if(res<0)
{
ERR_MSG("send");
return -1;
}
}
close(sfd);
close(newfd);
return 0;
}
2.客户端
#include<sys/socket.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<arpa/inet.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__:",__LINE__);\
perror(msg);\
}while(0)
int main(int argc, const char *argv[])
{
//创建流式套接字
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
//填充ip和端口信息到结构体中(服务器的)
struct sockaddr_in sin;
sin.sin_family = AF_INET; //地址族必须是AF_INET
sin.sin_port = htons(8888); //服务器的端口号的网络字节序(1024~49151)
sin.sin_addr.s_addr = inet_addr("192.168.31.109"); //服务器ip
//connect连接服务器
if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
{
ERR_MSG("connect");
return -1;
}
printf("connect success\n");
char buf[128]="";
ssize_t res;
while(1)
{
//发送
bzero(buf,sizeof(buf));
printf("请输入>>");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
res=send(sfd,buf,sizeof(buf),0);
if(res<0)
{
ERR_MSG("send");
return -1;
}
bzero(buf,sizeof(buf));
//接收
res=recv(sfd,buf,sizeof(buf),0);
if(res<0)
{
ERR_MSG("recv");
return -1;
}
if(res==0)
{
printf("对端关闭\n");
break;
}
printf("服务器:%s\n",buf);
}
close(sfd);
return 0;
}
3.机械臂
#include<sys/socket.h>
#include<sys/types.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<arpa/inet.h>
#include<linux/input.h>
#include<sys/stat.h>
#include<fcntl.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__:",__LINE__);\
perror(msg);\
}while(0)
int main(int argc, const char *argv[])
{
//创建流式套接字
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
printf("socket\n");
//填充ip和端口信息到结构体中(服务器的)
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(8888);
sin.sin_addr.s_addr = inet_addr("192.168.31.13");
//connect连接服务器
if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
{
ERR_MSG("connect");
return -1;
}
printf("connect success\n");
int fd=open("/dev/input/event1",O_RDONLY);
if(fd<0)
{
ERR_MSG("open");
return -1;
}
char buf1[5]={0xff,0x02,0x00,-80,0xff};
unsigned char buf2[5]={0xff,0x02,0x01,90,0xff};
ssize_t res;
struct input_event ev;
while(1)
{
res=read(fd,&ev,sizeof(ev));
if(res<=0)
{
ERR_MSG("read");
return -1;
}
switch(ev.code*ev.value)
{
case 17:if(buf1[3]<90){buf1[3]++;}break;
case 31:if(buf1[3]>-90){buf1[3]--;}break;
case 30:if(buf2[3]>0){buf2[3]--;}break;
case 32:if(buf2[3]<180){buf2[3]++;}break;
default:continue;
}
res=send(sfd,buf1,sizeof(buf1),0);
if(res<0)
{
ERR_MSG("send");
return -1;
}
res=send(sfd,buf2,sizeof(buf2),0);
if(res<0)
{
ERR_MSG("send");
return -1;
}
}
close(sfd);
return 0;
}