潘小胆(2807488604) 2023/7/5 下午 5:13:11
作业:
- 将TCP的服务器客户端重新写一遍
2服务器:
#include <myhead.h>
#define PORT 8070
#define IP "192.168.174.130"
int main(int argc, const char *argv[])
{
//创建套接字
int sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd == -1)
PRI_ERR("socket err");
//bind绑定
//1.创建服务器地址信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);//将端口号的主机字节序转为网络字节序
sin.sin_addr.s_addr = inet_addr(IP);//将IP地址转换为网络字节序
//2.调用bind函数绑定
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
PRI_ERR("bind err");
//listen转为被动监听模式
if(listen(sfd,128)==-1)
PRI_ERR("listen err");
//accept为客户端创建新的套接字文件描述符
//1.创建client地址信息结构体接受client的IP和PORT
struct sockaddr_in cin;
socklen_t len = sizeof(cin);
int nfd = accept(sfd,(struct sockaddr*)&cin,&len);
if(nfd == -1)
PRI_ERR("accept err");
char buf[128]="";
while(1){
memset(buf,0,sizeof(buf));
//接受数据
int ret = recv(nfd,buf,sizeof(buf),0);
if(ret < 0)
PRI_ERR("recv err");
else if(ret==0)
PRI_ERR("客户端断开");
else
{
printf("接收到%s.%d:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
}
//发送数据
memset(buf,0,sizeof(buf));
strcpy(buf,"hello client");
if(send(nfd,buf,sizeof(buf),0)==-1)
PRI_ERR("send err");
}
close(nfd);
//关闭sfd
close(sfd);
return 0;
}
.
客户端:
#include <myhead.h>
#define PORT 8070
#define IP "192.168.174.130"
int main(int argc, const char *argv[])
{
//创建套接字
int cfd = socket(AF_INET,SOCK_STREAM,0);
if(cfd == -1)
PRI_ERR("socket err");
//连接到server
//先创建地址信息结构体记录client的IP和PORT
struct sockaddr_in cin;
cin.sin_family = AF_INET;
cin.sin_port = htons(PORT);
cin.sin_addr.s_addr = inet_addr(IP);
//连接到
if(connect(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
PRI_ERR("connect err");
char buf[128]="";
while(1){
//发送数据
sleep(3);
memset(buf,0,sizeof(buf));
strcpy(buf,"hello server");
if(send(cfd,buf,sizeof(buf),0)==-1)
PRI_ERR("send err");
memset(buf,0,sizeof(buf));
//接受数据
int ret = recv(cfd,buf,sizeof(buf),0);
if(ret < 0)
PRI_ERR("recv err");
else if(ret==0)
PRI_ERR("服务器断开");
else
{
printf("接收到:%s\n",buf);
}
}
//关闭cfd
close(cfd);
return 0;
}
- 自行编写一个客户端代码,能够操作红色手臂移动到16度
#include <myhead.h>
#define IP "192.168.10.129"
#define PORT 7979
int main(int argc, const char *argv[])
{
//创建套接字
int cfd = socket(AF_INET,SOCK_STREAM,0);
if(cfd==-1)
{
PRI_ERR("socket error");
}
//绑定(不必须)
//连接服务器
//1创建server的地址信息结构体,填充信息
struct sockaddr_in cin;
cin.sin_family = AF_INET;
cin.sin_port = htons(PORT);//server端口号的网络字节序
cin.sin_addr.s_addr = inet_addr(IP);//serverIP的网络字节序
if(connect(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
{
PRI_ERR("connect error");
}
printf("connect success\n");
//发送消息
unsigned char hex[5] = {0xff,0x02,0x01,0x10,0xff};
if(send(cfd,hex,sizeof(long),0)==-1)
{
PRI_ERR("send error");
}
printf("send success\n");
//接收消息
char buf[128]="";
if(recv(cfd,buf,sizeof(buf),0)==-1)
PRI_ERR("recv error");
//关闭套接字文件
close(cfd);
return 0;
}
- 附加题:通过wasd按键控制机械臂,ws控制红色手臂加减,da控制蓝色手臂加减
#include <myhead.h>
#define IP "192.168.10.129"
#define PORT 7979
sem_t semr,semb;
void * task1(void *arg)
{
//先将两只手臂恢复原位
unsigned char hex[5] = {0xff,0x02,0x00,0x00,0xff};
int cfd = *(int*)arg;
send(cfd,hex,sizeof(hex),0);
while(1){
//P
sem_wait(&semb);
char key = getchar();
getchar();
printf("key = %c\t",key);
switch(key)
{
case 'w': {
hex[3]+=0x01;
send(cfd,hex,sizeof(hex),0);
}break;
case 's': {
hex[3]-=0x01;
send(cfd,hex,sizeof(hex),0);
}break;
}
//V
sem_post(&semr);
}
}
void * task2(void *arg)
{
//先将两只手臂恢复原位
unsigned char hex[5] = {0xff,0x02,0x01,0x00,0xff};
int cfd = *(int*)arg;
send(cfd,hex,sizeof(hex),0);
while(1){
//p
sem_wait(&semr);
char key = getchar();
getchar();
printf("key = %c\t",key);
switch(key)
{
case 'd': {
hex[3]+=0x01;
send(cfd,hex,sizeof(hex),0);
}break;
case 'a': {
hex[3]-=0x01;
send(cfd,hex,sizeof(hex),0);
}break;
}
//V
sem_post(&semb);
}
}
int main(int argc, const char *argv[])
{
//创建套接字
int cfd = socket(AF_INET,SOCK_STREAM,0);
if(cfd==-1)
{
PRI_ERR("socket error");
}
//绑定(不必须)
//连接服务器
//1创建server的地址信息结构体,填充信息
struct sockaddr_in cin;
cin.sin_family = AF_INET;
cin.sin_port = htons(PORT);//server端口号的网络字节序
cin.sin_addr.s_addr = inet_addr(IP);//serverIP的网络字节序
if(connect(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)
{
PRI_ERR("connect error");
}
printf("connect success\n");
//创建多线程
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,task1,&cfd))
PRI_ERR("tid1 err");
if(pthread_create(&tid2,NULL,task2,&cfd))
PRI_ERR("tid1 err");
//初始化信号量
sem_init(&semr,0,1);
sem_init(&semb,0,0);
while(1)
{
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
//关闭套接字文件
close(cfd);
//销毁信号量
sem_destroy(&semr);
sem_destroy(&semb);
return 0;
}
. 通过配网视屏重新配置一下网络
潘小胆(2807488604) 2023/7/5 下午 5:13:22
第1题 第2题上交