7.5 作业

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值