环境:Linux

语言:C/C++

通信方式:UDP

服务器端的步骤如下:

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的地址值结构体变量的长度。

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, );
if(sock_fd < )
{
perror("socket");
exit();
} /* 将套接字和IP、端口绑定 */
struct sockaddr_in addr_serv;
int len;
memset(&addr_serv, , 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)) < )
{
perror("bind error:");
exit();
} int recv_num;
int send_num;
char send_buf[] = "i am server!";
char recv_buf[];
struct sockaddr_in addr_client; while()
{
printf("server wait:\n"); recv_num = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), , (struct sockaddr *)&addr_client, (socklen_t *)&len); if(recv_num < )
{
perror("recvfrom error:");
exit();
} 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, , (struct sockaddr *)&addr_client, len); if(send_num < )
{
perror("sendto error:");
exit();
}
} close(sock_fd); return ;
}

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 "127.0.0.1" int main()
{
/* socket文件描述符 */
int sock_fd; /* 建立udp socket */
sock_fd = socket(AF_INET, SOCK_DGRAM, );
if(sock_fd < )
{
perror("socket");
exit();
} /* 设置address */
struct sockaddr_in addr_serv;
int len;
memset(&addr_serv, , 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[] = "hey, who are you?";
char recv_buf[]; printf("client send: %s\n", send_buf); send_num = sendto(sock_fd, send_buf, strlen(send_buf), , (struct sockaddr *)&addr_serv, len); if(send_num < )
{
perror("sendto error:");
exit();
} recv_num = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), , (struct sockaddr *)&addr_serv, (socklen_t *)&len); if(recv_num < )
{
perror("recvfrom error:");
exit();
} recv_buf[recv_num] = '\0';
printf("client receive %d bytes: %s\n", recv_num, recv_buf); close(sock_fd); return ;
}

程序运行截图:

client向服务器发送了“hey, who are you?”的字符串,server返回"i am server!"的字符串。

参考链接:

https://blog.csdn.net/imxiangzi/article/details/45689709

http://c.biancheng.net/cpp/html/3052.html

Linux C++ UDP Socket通信实例的更多相关文章

  1. Linux C++ TCP Socket通信实例

    环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服 ...

  2. Linux下简单的socket通信实例

    Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

  3. (8)Linux(客户端)和Windows(服务端)下socket通信实例

    Linux(客户端)和Windows(服务端)下socket通信实例: (1)首先是Windows做客户端,Linux做服务端的程序 Windows   Client端 #include <st ...

  4. 网络协议栈学习(一)socket通信实例

    网络协议栈学习(一)socket通信实例 该实例摘自<linux网络编程>(宋敬彬,孙海滨等著). 例子分为服务器端和客户端,客户端连接服务器后从标准输入读取输入的字符串,发送给服务器:服 ...

  5. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  6. Java Socket 通信实例 - 转载

    基于Tcp协议的简单Socket通信实例(JAVA)   好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些 ...

  7. c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

  8. 基于Tcp协议的简单Socket通信实例(JAVA)

    好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. ...

  9. python udp socket通信

    前段时间学习了一下c++的socket通信,但发现那玩意儿比较复杂还是转向python了,下面就是一个简单的udpsocket通信程序,欢迎大佬前来指正 udp聊天 import socket # 创 ...

随机推荐

  1. 牛客网 2018年东北农业大学春季校赛 I题 wyh的物品

    链接:https://www.nowcoder.com/acm/contest/93/I 来源:牛客网 时间限制:C/C++ 5秒,其他语言10秒空间限制:C/C++ 262144K,其他语言5242 ...

  2. (贪心) nyoj1036-非洲小孩

    题目描述: 家住非洲的小孩,都很黑.为什么呢?第一,他们地处热带,太阳辐射严重.第二,他们不经常洗澡.(常年缺水,怎么洗澡.)现在,在一个非洲部落里,他们只有一个地方洗澡,并且,洗澡时间很短,瞬间有木 ...

  3. linux proc

    /proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用.可以使用的文件随系统配置的变化而变化. /proc/cmdline 这个文件给出了内核启动的命 ...

  4. OS + linux proxy

    s Linux主机通过代理服务器进行网络连接 http://www.linuxidc.com/Linux/2015-01/111703.htm 新手用Linux做代理服务器 三招搞定 http://b ...

  5. 修复./mysql/proc

    mysql数据库只能建不能删的错误提示及处理方法: mysql> drop database zabbixaa; ERROR 145 (HY000): Table ‘./mysql/proc‘ ...

  6. 使用nvm安装node,全局npm,cnpm

    1.nvm-windows下载 下载地址https://github.com/coreybutler/nvm-windows/releases,下载nvm-setup.zip 2.安装nvm 首先把n ...

  7. navicat and connection is being used

    1.在已经保存的连接上上编辑,测试连接成功,但是点击连接就会一直提示 connection is being used 2.需要新建一个连接,才能使用,不能再已保存的上面修改

  8. DevC++ return 1 exit status

    当使用DevC++时编译运行程序出现 return 1 exit status 有可能是因为有在运行的命令窗口未关闭.

  9. impala系列: 字符串函数

    --=======================常用字符串函数--=======================base64decode(string str) : base64 解码.base64 ...

  10. content-type: application/json没有设置导致的500错误

    $.ajax({ url:'http://xxx.test', type: 'Post', data: JSON.stringify(model), dataType: 'json', content ...