8.13网络编程

笔记

多点通信

一、套接字属性

套接字属性的获取和设置

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int getsockopt(int sockfd, int level, int optname,
 void *optval, socklen_t *optlen);
       int setsockopt(int sockfd, int level, int optname,
 const void *optval, socklen_t optlen);
       功能:设置套接字在不同层上的属性
       参数1:套接字文件描述符
       参数2:要设置的层
               应用层:SOL_SOCKET
               传输层:tcp传输:IPPROTO_TCP
                       udp传输:IPPROTO_UDP
               网络层: IPPROTO_IP           
        参数3:要设置当前层的属性名称 ,常用每层属性见下表
        参数4:要设置或者获取属性的值    ,一般为int类型
        参数5:参数4的大小
        返回值:成功     返回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、需要使用setsockopt函数实现
2、需要对网络层设置:IPPROTO_IP
3、需要对加入多播组属性设置:IP_ADD_MEMBERSHIP
4、属性值的类型
           struct ip_mreqn {
               struct in_addr imr_multiaddr; /* 组播地址:D类网络(224.0.0.0 --- 239.255.255.255) */
               struct in_addr imr_address;   /* 当前主机IP地址 */
               int            imr_ifindex;   /* 网卡编号: 通过指令 ip ad查看 */
           };

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:指定角度

#include <myhead.h>

int main(int argc, const char *argv[])
{
	//创建套接字
	int sfd=socket(AF_INET,SOCK_STREAM,0);
	if(sfd==-1)
	{
		perror("soket error");
		return -1;
	}
	//绑定数据
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(8888);
	sin.sin_addr.s_addr=inet_addr("192.168.2.33");

	//端口快速重用
	int resue=1;
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&resue,sizeof(resue))==-1)
	{
		perror("setsockopt error");
		return -1;
	}
	//链接客户端
	if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
	{
		perror("connect error");
		return -1;
	}
	printf("链接成功!\n");

	//接收输入命令
	char buf=0;
	//定义机械臂控制指令
	char p1[5]={0xff,0x02,0x00,0x00,0xff};
	char p2[5]={0xff,0x02,0x01,0x00,0xff};
	//初始化机械臂
	send(sfd,p1,5,0);
	send(sfd,p2,5,0);
	//操控实现
	while(1)
	{
		buf=fgetc(stdin);
		if(buf=='w')
		{
			*(p1+3)=*(p1+3)+1;
			send(sfd,p1,5,0);
		}else if(buf=='s')
		{
			*(p1+3)=*(p1+3)-1;
			send(sfd,p1,5,0);
		}else if(buf=='d')
		{
			*(p2+3)=*(p2+3)+1;
			send(sfd,p2,5,0);
		}else if(buf=='a')
		{
			*(p2+3)=*(p2+3)-1;
			send(sfd,p2,5,0);
		}
	}
	close(sfd);

	return 0;
}

思维导图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值