8.13网络编程

打印 上一主题 下一主题

主题 510|帖子 510|积分 1530

笔记

多点通信

一、套接字属性

套接字属性的获取和设置
  1.        #include <sys/types.h>          /* See NOTES */
  2.        #include <sys/socket.h>
  3.        int getsockopt(int sockfd, int level, int optname,
  4. void *optval, socklen_t *optlen);
  5.        int setsockopt(int sockfd, int level, int optname,
  6. const void *optval, socklen_t optlen);
  7.        功能:设置套接字在不同层上的属性
  8.        参数1:套接字文件描述符
  9.        参数2:要设置的层
  10.                应用层:SOL_SOCKET
  11.                传输层:tcp传输:IPPROTO_TCP
  12.                        udp传输:IPPROTO_UDP
  13.                网络层: IPPROTO_IP           
  14.         参数3:要设置当前层的属性名称 ,常用每层属性见下表
  15.         参数4:要设置或者获取属性的值    ,一般为int类型
  16.         参数5:参数4的大小
  17.         返回值:成功     返回0,失败返回-1并置位错误码         
复制代码
二、网络通信方式

1> 单播:发送端和接收端完成一对一的通信方式。目前的通信模子都是单播
2> 广播:发送端和接收端完成一对多的通信方式,网络将发送端的数据,全部复制一遍发送给每个接收端一份。
3> 组播:发送端和接收端完成一对多的通信方式,但是仅仅只限于加入多播组的成员。
三、广播

1> 广播是实现网络通信中一对多的通信方式,发送端用于发送数据,每个接收端都可以收到消息
2> 对于套接字而言,一般是不答应发送广播消息的,须要对发送端套接字进行设置答应广播
setsockopt ---> SOL_SOCKET ----> SO_BROADCAST ----> int
3> 广播的发送端须要绑定广播所在
广播所在:网络号 + 255
当前网络中,主机号为255的那个ip所在
4> 广播消息不答应穿过路由器,广播所在只对当前局域网中的所有主机进行消息的转发
5> 广播分为发送端和接收端,发送端用于发送数据,接收端用于接收数据
6> 广播只能使用UDP实现,接收端无论愿不愿意接收,发送端都正常发送消息
7> 广播的发送端流程 ---> UDP的客户端
四、组播

1> 组播也是实现一对多的通信方式,对于广播而言,网络须要对每个消息进行复制转发,会占用大量的带宽,导致网络拥塞
2> 组播可以实现小范围的数据传播:将须要接收数据的接收端加入多播组,发送端向多播组中发送消息,每个组内成员都能接收到消息
3> 须要对接收端进行设置,将接收端加入多播组
  1. 1、需要使用setsockopt函数实现
  2. 2、需要对网络层设置:IPPROTO_IP
  3. 3、需要对加入多播组属性设置:IP_ADD_MEMBERSHIP
  4. 4、属性值的类型
  5.            struct ip_mreqn {
  6.                struct in_addr imr_multiaddr; /* 组播地址:D类网络(224.0.0.0 --- 239.255.255.255) */
  7.                struct in_addr imr_address;   /* 当前主机IP地址 */
  8.                int            imr_ifindex;   /* 网卡编号: 通过指令 ip ad查看 */
  9.            };
复制代码
4> 组播也是使用UDP实现的,无论接收端是否愿意接收数据,发送端都可以正常向多播组中发送数据
5> 组播也分为发送端和接收端流程
6> 组播发送端流程 -----> 类似于UDP的客户端流程
7> 组播的接收端流程 ------> 类似于UDP的服务器端流程
作业

TCP机械臂测试
通过w(红色臂角度增大)s(红色臂角度减小)d(蓝色臂角度增大)a(蓝色臂角度减小)按键控制机械臂
注意:关闭计算机的杀毒软件,电脑管家,防火墙
1)基于TCP服务器的机械臂,端标语是8888, ip是Windows的ip;
查看Windows的IP:按住Windows+r 按键,输入cmd , 输入ipconfig
2)点击软件中的开启监听;
3)机械臂须要发送16进制数,共5个字节,协议如下
0xff 0x02 x y 0xff 0xff:起始结束协议,固定的; 0x02:控制机械手臂协议,固定的; x:指定要操作的机械臂 0x00 红色摆臂 0x01 蓝色摆臂 y:指定角度
  1. #include <myhead.h>
  2. int main(int argc, const char *argv[])
  3. {
  4.         //创建套接字
  5.         int sfd=socket(AF_INET,SOCK_STREAM,0);
  6.         if(sfd==-1)
  7.         {
  8.                 perror("soket error");
  9.                 return -1;
  10.         }
  11.         //绑定数据
  12.         struct sockaddr_in sin;
  13.         sin.sin_family=AF_INET;
  14.         sin.sin_port=htons(8888);
  15.         sin.sin_addr.s_addr=inet_addr("192.168.2.33");
  16.         //端口快速重用
  17.         int resue=1;
  18.         if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&resue,sizeof(resue))==-1)
  19.         {
  20.                 perror("setsockopt error");
  21.                 return -1;
  22.         }
  23.         //链接客户端
  24.         if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
  25.         {
  26.                 perror("connect error");
  27.                 return -1;
  28.         }
  29.         printf("链接成功!\n");
  30.         //接收输入命令
  31.         char buf=0;
  32.         //定义机械臂控制指令
  33.         char p1[5]={0xff,0x02,0x00,0x00,0xff};
  34.         char p2[5]={0xff,0x02,0x01,0x00,0xff};
  35.         //初始化机械臂
  36.         send(sfd,p1,5,0);
  37.         send(sfd,p2,5,0);
  38.         //操控实现
  39.         while(1)
  40.         {
  41.                 buf=fgetc(stdin);
  42.                 if(buf=='w')
  43.                 {
  44.                         *(p1+3)=*(p1+3)+1;
  45.                         send(sfd,p1,5,0);
  46.                 }else if(buf=='s')
  47.                 {
  48.                         *(p1+3)=*(p1+3)-1;
  49.                         send(sfd,p1,5,0);
  50.                 }else if(buf=='d')
  51.                 {
  52.                         *(p2+3)=*(p2+3)+1;
  53.                         send(sfd,p2,5,0);
  54.                 }else if(buf=='a')
  55.                 {
  56.                         *(p2+3)=*(p2+3)-1;
  57.                         send(sfd,p2,5,0);
  58.                 }
  59.         }
  60.         close(sfd);
  61.         return 0;
  62. }
复制代码
头脑
导图



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

祗疼妳一个

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表