1. socket: 建立一个socket
2. bind: 将这个socket绑定在某个端口上(AF_INET)
3. recvfrom: 如果没有客户端发起请求,则会阻塞在这个函数里
4. close: 通信完成后关闭socket
客户端的步骤如下:
1. socket: 建立一个socket
2. sendto: 向服务器的某个端口发起请求(AF_INET)
3. close: 通信完成后关闭socket
基于UDP的接收和发送函数
int recvfrom(int sockfd, void * buf, size_t len, int flags, struct sockaddr * src_addr, socklen_t * addrlen);
int sendto(int sockfd, const void * buf, size_t len, int flags, const struct sockaddr * dest_addr, socklen_t addrlen);
UDP套接字不会保持连接状态,每次传输数据都要添加目标地址信息,这相当于在邮寄包裹前填写收件人地址。
recvfrom用于接收数据,sendto用于发送数据
recvfrom:
-
sockfd:用于接收UDP数据的套接字;
-
buf:保存接收数据的缓冲区地址;
-
len:可接收的最大字节数(不能超过buf缓冲区的大小);
-
flags:可选项参数,若没有可传递0;
-
src_addr:存有发送端地址信息的sockaddr结构体变量的地址;
-
addrlen:保存参数 src_addr的结构体变量长度的变量地址值。
sendto:
-
sockfd:用于传输UDP数据的套接字;
-
buf:保存待传输数据的缓冲区地址;
-
len:带传输数据的长度(以字节计);
-
flags:可选项参数,若没有可传递0;
-
dest_addr:存有目标地址信息的 sockaddr 结构体变量的地址;
-
addrlen:传递给参数 dest_addr的地址值结构体变量的长度。
Client.cpp
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define DEST_PORT 8000
#define DSET_IP_ADDRESS "192.168.1.123"
int main()
/* socket文件描述符 */
int sock_fd;
/* 建立udp socket */
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(sock_fd < 0)
perror("socket");
exit(1);
/* 设置address */
struct sockaddr_in addr_serv;
int len;
memset(&addr_serv, 0, sizeof(addr_serv));
addr_serv.sin_family = AF_INET;
addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
addr_serv.sin_port = htons(DEST_PORT);
len = sizeof(addr_serv);
int send_num;
int recv_num;
char send_buf[20] = "hey, who are you?";
char recv_buf[20];
while(1)
printf("client send: %s\n", send_buf);
send_num = sendto(sock_fd, send_buf, strlen(send_buf), 0, (struct sockaddr *)&addr_serv, len);
if(send_num < 0)
perror("sendto error:");
exit(1);
recv_num = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&addr_serv, (socklen_t *)&len);
if(recv_num < 0)
perror("recvfrom error:");
exit(1);
recv_buf[recv_num] = '\0';
printf("client receive %d bytes: %s\n", recv_num, recv_buf);
sleep(10);
close(sock_fd);
return 0;
Server.cpp
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#define SERV_PORT 8000
int main()
/* sock_fd --- socket文件描述符 创建udp套接字*/
int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(sock_fd < 0)
perror("socket");
exit(1);
/* 将套接字和IP、端口绑定 */
struct sockaddr_in addr_serv;
int len;
memset(&addr_serv, 0, sizeof(struct sockaddr_in)); //每个字节都用0填充
addr_serv.sin_family = AF_INET;//使用IPV4地址
addr_serv.sin_port = htons(SERV_PORT);//端口
/* INADDR_ANY表示不管是哪个网卡接收到数据,只要目的端口是SERV_PORT,就会被该应用程序接收到 */
addr_serv.sin_addr.s_addr = htonl(INADDR_ANY); //自动获取IP地址
len = sizeof(addr_serv);
/* 绑定socket */
if(bind(sock_fd, (struct sockaddr *)&addr_serv, sizeof(addr_serv)) < 0)
perror("bind error:");
exit(1);
int recv_num;
int send_num;
char send_buf[20] = "i am server!";
char recv_buf[20];
struct sockaddr_in addr_client;
while(1)
printf("server wait:\n");
recv_num = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&addr_client, (socklen_t *)&len);
if(recv_num < 0)
perror("recvfrom error:");
exit(1);
recv_buf[recv_num] = '\0';
printf("server receive %d bytes: %s\n", recv_num, recv_buf);
send_num = sendto(sock_fd, send_buf, recv_num, 0, (struct sockaddr *)&addr_client, len);
if(send_num < 0)
perror("sendto error:");
exit(1);
close(sock_fd);
return 0;
虚拟机作为client,开发板作为server。
运行前,确保虚拟机和开发板可以互相ping通
服务器端的步骤如下:1. socket: 建立一个socket2. bind: 将这个socket绑定在某个端口上(AF_INET)3. recvfrom: 如果没有客户端发起请求,则会阻塞在这个函数里4. close: 通信完成后关闭socket客户端的步骤如下:1. socket: 建立一个socket2. se...
之前的博文介绍了如何在ubuntu下实现unix domain socket通信,但只是本地的通信,虽然过程和网络通信很类似,但这里还是有必要了解下真正的socket通信
首先贴出server端的c代码
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h&...
本期为大家带来的是网络编程的 UDP Socket 套接字,基于 UDP协议的 Socket 实现客户端服务器通信,Socket 套接字可以理解为是,传输层给应用层提供的一组 API,如此程序,确定不来看看嘛~~
更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘
Ubuntu18.04 ROS udp Server通信实现
此小节介绍udp Server收发数据,并将截取到底信息通过话题方式发布出去。下一节介绍Ubuntu18.04 ROS udp client通信实现。 后续介绍Android与Ubuntu的网络通信,通过Android与工控机配合实现车辆遥控操作。
测试过程和效果
测试平台为Ubuntu18.04 与Windows系统上的网络调试助手进行通信测试,调试助手采用的有人科技的USR-TCP232-Test-V1.3。
测试过程为:过程1 2与文章
在Ubuntu18.04中的两个程序(基于C++)的UDP通信
此文章将展示两个C++应用程序,这个应用中都分别定义了作为Serve和Client的部分,便于相互发送和接收测试。
测试分为两部分,第一部分测试是字符串的发送和接收,第二部分测试是结构体的发送和接收(其实也是先转化为字符串发送,接收后再转化为结构体的方式)
使用者可对相应部分进行注释和取消注释,以分别测试这两个功能。
Code1:这段代码用作发送(实际稍作修改后发送和接收都可)
#include <stdio.h>
虚拟机下ubuntu安装
(一).VMvare的安装
ubuntu-14.04.1-desktop-amd64+mac.iso链接:https://pan.baidu.com/s/1LoBRc7GMCMBwyuvDHKW9Kw
提取码:d5wf
VMware-workstation-full-11...
连接虚拟机和开发板可以通过SSH协议来完成。首先需要确保虚拟机和开发板都已经启动,并且都已经安装了SSH服务端程序。然后在虚拟机上打开终端,输入以下命令来连接开发板:
ssh username@IP_address_of_development_board
其中,username是开发板的用户名,IP_address_of_development_board是开发板的IP地址。输入完命令后按下回车键,会提示输入密码,输入正确的密码即可连接成功。
如果需要从外部网络连接到开发板,需要在路由器中设置端口转发,将路由器的某个端口映射到开发板的SSH服务端口上,然后通过路由器的公网IP地址和端口号来连接开发板。