2024/3/26

1 #include<myhead.h>
  2 #include<linux/input.h>
  3 #define SER_PORT 8888
  4 #define SER_IP "192.168.116.225"
  5 #define CLI_PORT 9999
  6 #define CLI_IP "192.168.65.129"
  7 int main(int argc, const char *argv[])
  8 {
  9     //1、创建用于连接的客户端套接字
 10     int cfd = socket(AF_INET,SOCK_STREAM,0);
 11     if(cfd == -1)
 12     {
 13         perror("socket error");
 14         return -1;
 15     }
 16     printf("%d 客户端套接字创建成功\n",__LINE__);
 17     //设置端口号快速重用
 18     int reuse = 1;
 19     if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR|SO_REUSEPORT, &reuse, sizeof(reuse)) ==-1)
 20     {
 21         perror("setsockopt error");
 22         return -1;
 23     }
 24     printf("端口号快速重用成功\n");
 25     //2、绑定端口号和ip地址(非必须)                                                                                                                                                                                                                                                                           
 26     //2.1 填充客户端地址信息结构体
 27     struct sockaddr_in cin;
 28     cin.sin_family = AF_INET;
 29     cin.sin_port = htons(CLI_PORT);
 30     cin.sin_addr.s_addr = inet_addr(CLI_IP);
 31     //2.2 绑定端口号和IP
 32     if(bind(cfd,(struct sockaddr *)&cin,sizeof(cin))==-1)
 33     {
 34         perror("bind error\n");\
 35             return -1;
 36     }
 37     printf("%d bind success\n",__LINE__);
 38 
 39     //3、连接服务器
 40     //3.1 填充要连接服务器的地址信息结构体
 41     struct sockaddr_in sin;
 42     sin.sin_family = AF_INET;
 43     sin.sin_port = htons(SER_PORT);
 44     sin.sin_addr.s_addr = inet_addr(SER_IP);
 45     //3.2 连接服务器
 46     if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
 47     {
 48         perror("connect error");
 49         return -1;
 50     }
 51     printf("%d 连接成功\n",__LINE__);
 52     //定义机械臂的容器
 53     unsigned char blue[5] = {0xff,0x02,0x01,0x00,0xff};
 54     char red[5] = {0xff,0x02,0x00,0x00,0xff};
 55 
 56     //将数据发送给服务器以初始化
 57     send(cfd,blue,sizeof(blue),0);
 58     sleep(1);
 59     send(cfd,red,sizeof(red),0);
 60     //定义一个读取数据的结构体变量
 61     //struct input_event ie;
 62     //int res = open("/dev/input/event1",O_RDONLY);
 63     //if(res == -1)
 64     /*{
 65       perror("open error\n");
 66       return -1;
 67       }
 68       */
 69     //收发数据
 70     char ctrl = 0;
 71     while(1)
 72     {
 73         ctrl=getchar();
 74         switch(ctrl)
 75         {
 76         case 'w':
 77             {
 78                 //红色臂角度增大w
 79                 red[3] += 5;
 80                 if(red[3]>=90)
 81                 {
 82                     red[3]==90;
 83                 }
 84                 send(cfd,red,sizeof(red),0);
 85             }
 86             break;
 87         case 's':
 88             {
 89                 //红色臂角度减小s
 90                 red[3] -= 5;
 91                 if(red[3]<=-90)
 92                 {
 93                     red[3]==-90;
 94                 }
 95                 send(cfd,red,sizeof(red),0);
 96             }
 97             break;
 98         case 'd':
 99             {
100                 //蓝色臂角度减小d
101                 blue[3] -= 5;
102                 if(blue[3]<=0)
103                 {
104                     blue[3]==0;
105                 }
106                 send(cfd,blue,sizeof(blue),0);
107             }
108             break;
109         case 'a':
110             {
111                 //蓝色臂角度增大a
112                 blue[3] += 5;
113                 if(blue[3]>=180)
114                 {
115                     blue[3]==180;
116                 }
117                 send(cfd,blue,sizeof(blue),0);
118             }
119             break;
120         case 'q':
121             goto END;
122         }
123     }
124 
125 END:
126     close(cfd);
127 
128     return 0;
129 
130 }

模拟面试总结:

什么是IP地址?

IP地址是主机在网络中的唯一标识(也是路由器选择的唯一标识),当主机从一个网络切换到另一个网络时,他会更改IP地址。

IP地址也分为IPv4和IPv6,IP地址一般由网络号和主机号组成。

IP地址和MAC地址的区别?

IP地址不一定是计算机的唯一标识,随着网络的切换,IP地址会发生更改,但是MAC地址不会发生更改。

MAC地址是计算机厂商给的唯一标识,全球唯一。

什么是端口号?

端口号是计算机用来区分同一主机上的多个进程而引入的,是一个两字节的无符号整数,也是网络通信中两个决定性因素之一。同时端口号分为三类:系统指定端口号,用户可用端口号,自动分配端口号。

TCP通信中的服务器实现流程?

通过socket创建一个套接字用于后续的通信,再通过bind函数来绑定服务器的IP地址和端口号并通过listen函数开启监听效果,之后通过accept函数实现与客户端的连接,后续便可以使用recv/send函数实现与客户端的数据交换过程,完成交换数据后可通过close函数关闭套接字。

TCP通信中的客户端实现流程 ?

通过socket创建一个套接字用于后续的通信,再通过bind函数来绑定客户端的IP地址和端口号并通过listen函数开启监听效果,之后通过connect函数实现与服务器的连接,后续便可以使用recv/send函数实现数据交换过程,完成交换数据后可通过close函数关闭套接字。

TCP和UDP的区别?

TCP ----> 稳定

1> 提供面向连接的,可靠的数据传输服务

2> 传输过程中,数据无误、数据无丢失、数据无失序、数据无重复

1、TCP会给每个数据包编上编号,该编号称之为序列号

2、每个序列号都需要应答包应答,如果没有应答,则会将上面的包重复发送直到正确为止

3> 数据传输效率低,耗费资源多

4> 数据收发是不同步的

1、为了提高效率,TCP会将多个较小,并且发送间隔短的数据包,沾成一个包发送,该现象称为沾包现象

2、该沾包算法称之为Nagle算法

5> TCP的使用场景:对传输质量比较高的以及传输大量数据的通信,在需要可靠通信的传输场合,一般使用TCP协议

例如:账户登录,大型文件下载的时候

UDP ----> 快速

1> 面向无连接的,不保证数据可靠的,尽最大努力传输的协议

2> 数据传输过程中,可能出现数据丢失、重复、失序现象

3> 数据传输效率高,实时性高

4> 限制每次传输的数据大小,多出部分直接忽略删除

5> 收发是同步的,不会沾包

6> 适用场景:发送小尺寸的,在接收到数据给出应答比较困难的情况下

例如:广播、通讯软件的音视频

TCP通信中的三次握手四次挥手?

UDP中是否可以使用connect函数进行连接?

1> udp通信中可以使用connect函数,他是将服务器与某个客户端建立一个唯一通道

2> 好处:传输效率高,稳定性高,数据干扰较小

3> 在服务器端使用connect与某个特定的客户端建立连接后,服务器就不再接收其他客户端的消息了

4> 如果想要断开,需要再使用一次connect函数,但是需要将地址信息结构体中的sin_addr改成AF_UNSPEC

5> 在udp中可以多次使用connect函数与其他客户端建立连接,但是在TCP中只能进行一次连接

6> 当UDP中使用了connect与某个特定的客户端建立连接后,就可以正常使用read/write、send/recv函数完成通信

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-17 01:26:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-17 01:26:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-17 01:26:02       82 阅读
  4. Python语言-面向对象

    2024-03-17 01:26:02       91 阅读

热门阅读

  1. 一文解读ISO26262安全标准:术语(二)

    2024-03-17 01:26:02       41 阅读
  2. linux系统kubernetes概念

    2024-03-17 01:26:02       41 阅读