1. 将TCP的服务器客户端重新写一遍
#include <myhead.h>
#define ERR_MSG(msg) fprintf(stderr,"%d\n",__LINE__);perror(msg);
#define IP "192.168.10.146"
void *fdread(void *arg)
{
int newfd = *(int *)arg;
while(1)
{
char buf[20] = "";
ssize_t res = recv(newfd,buf,sizeof(buf),0);//读取信息
if(res < 0)
{
ERR_MSG("recv");
return NULL;
}
else if(res == 0)
{
printf("客户端:%d 下线\n",newfd);
break;
}
if(buf[0]=='\n')
break;
printf("客户端:%d 的消息:%s\n",newfd,buf);
}
close(newfd);
}
void *fdwrite(void *arg)
{
int newfd = *(int *)arg;
while(1)
{
char buf[20] = "";
fgets(buf,sizeof(buf),stdin);
ssize_t res = send(newfd,buf,sizeof(buf),0);//写入信息
if(res < 0)
{
ERR_MSG("send");
return NULL;
}
}
close(newfd);
}
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;
}
printf("允许端口快速被重用成功\n");
struct sockaddr_in sai;
sai.sin_family = AF_INET;//协议族
sai.sin_port = htons(6666);//服务器端口
sai.sin_addr.s_addr = inet_addr(IP);//服务器IP
if(bind(sfd,(struct sockaddr *)&sai,sizeof(struct sockaddr_in)) < 0)//绑定ip和端口
{
ERR_MSG("bind");
return -1;
}
puts("bind success");
if(listen(sfd,128) < 0)//设置为被动监听状态,最大128
{
ERR_MSG("listen");
return -1;
}
puts("listen success");
struct sockaddr_in addr;
socklen_t addrlen;
int newfd = accept(sfd,(struct sockaddr *)&addr,&addrlen);//等待客户端连接,返回客户端的文件描述符和ip端口等
if(newfd <0)
{
ERR_MSG("accept");
return -1;
}
printf("[%s:%d]newfd = %d 客户端连接成功\n",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port),newfd);
pthread_t tid1,tid2;//设置2个线程
if(pthread_create(&tid1,NULL,fdread,&newfd))//用于读取客户端的信息
{
ERR_MSG("pthread_create");
return -1;
}
if(pthread_create(&tid2,NULL,fdwrite,&newfd))//往客户端写信息
{
ERR_MSG("pthread_create");
return -1;
}
pthread_join(tid1,NULL);
//pthread_join(tid2,NULL);
if(close(sfd) < 0)
{
ERR_MSG("close");
return -1;
}
return 0;
}
#include <myhead.h>
#define ERR_MSG(msg) fprintf(stderr,"%d\n",__LINE__);perror(msg);
#define IP "192.168.10.146"
void *cliwrite(void *arg)
{
int cfd = *(int *)arg;
while(1)
{
char buf[20] = "";
fgets(buf,sizeof(buf),stdin);
ssize_t res = send(cfd,buf,sizeof(buf),0);//往服务器写
if(buf[0] == '\n')
break;
if(res < 0)
{
ERR_MSG("send");
return NULL;
}
}
close(cfd);
}
void *cliread(void *arg)
{
int cfd = *(int *)arg;
while(1)
{
char buf[20] = "";
ssize_t res = recv(cfd,buf,sizeof(buf),0);//从服务器读
if(res < 0)
{
ERR_MSG("revc");
return NULL;
}
else if(res == 0)
{
printf("服务器:%d 下线\n",cfd);
return NULL;
}
printf("服务器:%d 的消息:%s",cfd,buf);
}
close(cfd);
}
int main(int argc,const char *argv[])
{
int cfd = socket(AF_INET,SOCK_STREAM,0);//获得客户端套接子文件描述符
if(cfd < 0)
{
ERR_MSG("socket");
return -1;
}
struct sockaddr_in sai;
sai.sin_family = AF_INET;//服务器地址族
sai.sin_port = htons(6666);//服务器端口
sai.sin_addr.s_addr = inet_addr(IP);//服务器ip
if(connect(cfd,(struct sockaddr*)&sai,sizeof(sai)) < 0)//和服务器进行连接
{
ERR_MSG("connect");
return -1;
}
printf("连接服务器:%d\n",cfd);
pthread_t tid1,tid2;//创建2个线程
if(pthread_create(&tid1,NULL,cliwrite,&cfd) < 0)//往服务器写
{
ERR_MSG("tid1");
return -1;
}
if(pthread_create(&tid2,NULL,cliread,&cfd) < 0)//从服务器读
{
ERR_MSG("tid2");
return -1;
}
pthread_join(tid1,NULL);
//pthread_join(tid2,NULL);
return 0;
}
2. 自行编写一个客户端代码,能够操作红色手臂移动到16度
#include <myhead.h>
#define ERR_MSG(msg) fprintf(stderr,"%d\n",__LINE__);perror(msg);
#define IP "192.168.10.137"
int main(int argc,const char *argv[])
{
int cfd = socket(AF_INET,SOCK_STREAM,0);//获得套接子文件描述符
if(cfd < 0)
{
ERR_MSG("socket");
return -1;
}
puts("socket success");
struct sockaddr_in addr;
addr.sin_family = AF_INET;//服务器地址族
addr.sin_port = htons(8888);//服务器端口
addr.sin_addr.s_addr = inet_addr(IP);//服务器ip
if(connect(cfd,(struct sockaddr *)&addr,sizeof(addr)))//和服务器进行连接
{
ERR_MSG("connect");
return -1;
}
puts("connect success");
uint8_t cz[5]={0xff,0x02,0x00,0x10,0xff};//机械壁协议,红色转到16度
if(send(cfd,cz,sizeof(cz),0) < 0)//发送
{
ERR_MSG("send");
return -1;
}
close(cfd);
return 0;
}
3. 附加题:通过wasd按键控制机械臂,ws控制红色手臂加减,da控制蓝色手臂加减
#include <myhead.h>
#define ERR_MSG(msg) fprintf(stderr,"%d\n",__LINE__);perror(msg);
#define IP "192.168.10.137"
#define S 10;
int czfun(uint8_t *cz,int cfd)
{
if(send(cfd,cz,5,0) < 0)//往服务器传送协议
{
ERR_MSG("send");
return -1;
}
return 0;
}
int main(int argc,const char *argv[])
{
int cfd = socket(AF_INET,SOCK_STREAM,0);//获得套接字文件描述符
if(cfd < 0)
{
ERR_MSG("socket");
return -1;
}
puts("socket success");
struct sockaddr_in addr;
addr.sin_family = AF_INET;//服务器地址族
addr.sin_port = htons(8888);//服务器端口
addr.sin_addr.s_addr = inet_addr(IP);//服务器ip
if(connect(cfd,(struct sockaddr *)&addr,sizeof(addr)))//连接服务器
{
ERR_MSG("connect");
return -1;
}
puts("connect success");
uint8_t rcz[5]={0xff,0x02,0x00,0x00,0xff};//红色机械臂协议
uint8_t bcz[5]={0xff,0x02,0x01,0x00,0xff};//蓝色机械臂协议
while(1)
{
char a = getchar();//获得wasd
getchar();
switch(a)
{
case 'w'://红色机械臂加
rcz[3]+=S;
if(rcz[3] > 90) rcz[3] = 90;
czfun(rcz,cfd);//传输协议
break;
case 's'://红色减
rcz[3]-=S;
if(rcz[3] > 90) rcz[3] = -90;
czfun(rcz,cfd);
break;
case 'a'://蓝色减
bcz[3]-=S;
if(rcz[3] > 180) rcz[3] = 0;
czfun(bcz,cfd);
break;
case 'd'://蓝色加
bcz[3]+=S;
if(bcz[3] > 180) bcz[3] = 180;
czfun(bcz,cfd);
break;
}
if(a=='\n')
break;
}
close(cfd);
return 0;
}