机器人中常用的通信方式--套接字

题记:机器人中常用的通信方式有3种,tcp通信,udp通信,can通信
1、套接字(socket)
1.1、什么是socket
socket是一种通信机制,可以应用于计算机不同进程之间通信,包括同一台计算机和网络中不同计算机之间的进程之间通信,结果就是支持分布在网络中的各个服务端/客户端的通信。
socket的字面意思是插座,插座的作用提供电源,也就是所谓的服务端,相应的插头是客户端,插头插到插座里,联通得到相应的电压,也就是获得相应通信连接。
需要注意的是:socket一旦建立连接,通信是双向通信。
1.2 socket连接方式
socket连接方式用以下步骤来说明。
服务端:
1)创建socket,也就是创建服务端(插座)
2)服务器进程给套接字命名,调用blind函数
3)服务器进程监听客户端的请求连接队列,调用listen函数
4)服务器进程接受客服连接,调用accept函数,此时程序创建一个新的套接字专门处理一个客户连接,2)步骤的命名的套接字继续用来监听客户连接,一旦调用accept,则继续创建新的套接字。
客户端:
1)创建一个未命名的套接字(插头)
2)命名客户端套接字,根据服务端信息来命名客户端套接字
3)指定服务器端地址(找到插座地址),调用connect函数,建立连接

本地客户端的例子:
client.c

//必要的头文件
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>

int main(){
//1)设置变量
int sockfd;//用来装载创建套接字的结果
int len;
struct sockaddr_un address;//用来装载服务端给定的地址
int result;//用来装载是否连接成功的结果1表示成功,-1表示失败
char ch='A';
//2)创建客户端套接字
sockfd=socket(AF_UNIX,SOCK_STREAM,0);
//3)根据服务端,给套接字命名
address.sun_family=AF_UNIX;
strcpy(address.sun_path,"server_socket");
len=sizeof(address);
//4)连接到服务端套接字
result=connet(sockfd,(struct sockaddr*)&address,len);
if(result==-1){
perror("oops:client1");
exit(0);
}
//5)通过套接字进行读写操作
write(sockfd,&ch,1);//通过套接字,修改了ch变量
read(sockfd,&ch,1);//通过套接字,读取了ch变量
printf("char from server=%c\n",ch);
close(sockfd);//用完套接字后关闭
exit(0);
}

下面给出一个本地服务端的标准例子
server1.c

//必要的头文件
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.b>

int main(){
//1)创建必要的变量
int server_sockfd,client_sockfd;//分别用来装载创建的套接字的值
int server_len,client_len;//套接字地址的长度
struct sockaddr_un server_address;//装载套接字地址
struct sockaddr_un client_address;
//2)删除以前的套接字,创建一个未命名的套接字
unlink("server_socket");
server_sockfd=socket(AF_UNIX,SOCK_STREAM,0);
//3)命名套接字
server_address.sun_family=AF_UNIX;
strcpy(server_address.sun_path,"server_socket");
server_len=sizeof(server_address);
blind(server_sockfd,(struct sockaddr*)&server_address,server_len);
//4)创建连接队列,等待客户进行连接
listen(server_sockfd,5);//监听队列为5
while(1){
char ch;
printf("server wating\n");
//服务端接受一个连接
client_len=sizeof(client_address);
client_sockfd=accept(server_sockfd,(struct sockaddr*)&client_address,&client_lent);
//6)对接受的客户端的套接字进行读写
read(client_sockfd,&ch,1);
ch++;
write(client_sockfd,&ch,1);
close(client_sockfd);//用完套接字后需要关闭
}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值