Linux C++ UDP Socket通信实例
环境: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通信实例的更多相关文章
- Linux C++ TCP Socket通信实例
环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服 ...
- Linux下简单的socket通信实例
Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...
- (8)Linux(客户端)和Windows(服务端)下socket通信实例
Linux(客户端)和Windows(服务端)下socket通信实例: (1)首先是Windows做客户端,Linux做服务端的程序 Windows Client端 #include <st ...
- 网络协议栈学习(一)socket通信实例
网络协议栈学习(一)socket通信实例 该实例摘自<linux网络编程>(宋敬彬,孙海滨等著). 例子分为服务器端和客户端,客户端连接服务器后从标准输入读取输入的字符串,发送给服务器:服 ...
- Flex通信-与Java实现Socket通信实例
Flex通信-与Java实现Socket通信实例 转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...
- Java Socket 通信实例 - 转载
基于Tcp协议的简单Socket通信实例(JAVA) 好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些 ...
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
- 基于Tcp协议的简单Socket通信实例(JAVA)
好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. ...
- python udp socket通信
前段时间学习了一下c++的socket通信,但发现那玩意儿比较复杂还是转向python了,下面就是一个简单的udpsocket通信程序,欢迎大佬前来指正 udp聊天 import socket # 创 ...
随机推荐
- POJ 1659 Frogs' Neighborhood (Havel--Hakimi定理)
Frogs' Neighborhood Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 10545 Accepted: 4 ...
- emacs简易配置
(setq-default inhibit-startup-message t tab-width 4 c-basic-offset 4 indent-tabs-mode t) (tool-bar-m ...
- Collection中的迭代器
迭代器:boolean hasNext() 判断集合中是否还有没有被取出数据nexe() 取出集合中下一个元素package cn.lijun.demo4; import java.util.Arra ...
- day05-(validate&bootstred)
网站分享: http://www.runoob.com/ 回顾: html:展示 文件 标签: <html> <head> <title></title> ...
- Hibernate的入门:
1 下载Hibernate5 http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-r ...
- MySQL语句_积累
1.GROUP_CONCAT 直接返回拼接好的多个结果,可以供IN()函数使用 语句 结果 +-----------------------------------------+ | GROUP_CO ...
- JavaSE_坚持读源码_ArrayList对象_Java1.7
底层的数组对象 /** * The array buffer into which the elements of the ArrayList are stored. * The capacity o ...
- java FindMyIP.java
s ganymed-ssh2-build210.jar package com.iteye.lindows.ssh.ip; import java.io.BufferedReader; import ...
- redis的一些修改
redis修改的文件目录:redis.conf 1.bind:127.0.0.1 默认是本地访问,但是redis是支持集群的,改成0.0.0.0 可以使任意服务器访问 2.daemonize:yes ...
- windows安装gitblit服务端
由于windows下没有gitlab之类的工具,只有很久没有更新的gitblit 下载Gitblit, 下载地址:http://www.gitblit.com/ 很长时间没有更新了,在没有linux环 ...