linux udp收发程序,linux下UDP通信介绍及demo

  • Post author:
  • Post category:linux


UDP介绍

UDP — ⽤户数据报协议,是⼀个⽆连接的简单的⾯向数据报的运输层协 议。UDP不提供可靠性,它只是把应⽤程序传给IP层的数据报发送出去,但是并不能保证它们能到达⽬的地。由于UDP在传输数据报前不⽤在客户和服 务器之间建⽴⼀个连接,且没有超时重发等机制,故⽽传输速度很快。

UDP是⼀种⾯向⽆连接的协议,每个数据报都是⼀个独⽴的信息,包括完整 的源地址或⽬的地址,它在⽹络上以任何可能的路径传往⽬的地,因此能否 到达⽬的地,到达⽬的地的时间以及内容的正确性都是不能被保证的。

1 send端

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

int main(int argc, char *argv[])

{

struct sockaddr_in s_addr;//结构体

int sock;

int addr_len;//获取结构长度

int len;

char buff[128];

int yes;

if (argc != 2)

{

printf(“Please input %s IP\n”,argv[1]);

}

if(-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0))){ //以UDP方式创建socket 创建创建创建

perror(“socket”);

exit(EXIT_FAILURE);

}

else

cout<

yes = 1;

setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); //设置socket为可发送广播消息

s_addr.sin_family = AF_INET;

s_addr.sin_port = htons(7838);//指定接收广播消息的端口

if(argv[1]){

s_addr.sin_addr.s_addr = inet_addr(argv[1]); //argv[1] 为广播消息的目的地址,即广播地址

}

else{

printf(“input server IP!\n”);

exit(0);

}

addr_len = sizeof(s_addr);

strcpy(buff, “hello message”);

// while(1){

int i;

for(i=0; ; i++){

len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr*)&s_addr, addr_len); //使用UDP广播的消息

if(len < 0){

printf(“\n\rsend error.\n\r”);

exit(EXIT_FAILURE);

}

//sleep(1);

printf(“send success %d:\tsend message is %s\n”,i,&buff);

}

return 0;

}

send端的CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.10)

project(UDP)

set(CMAKE_CXX_STANDARD 11)

add_executable(UDP main.cpp)

2 receive端

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define MAXSIZE 128

int main(int argc, char* argv[])

{

struct sockaddr_in s_addr;

struct sockaddr_in c_addr; //发送端

int sock;

socklen_t addr_len;

int len;

char buff[MAXSIZE];

if(-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0))){//以UDP方式创建socket 创建创建创建

perror(“socket”);

exit(EXIT_FAILURE);

}

else

printf(“create socket success\n”);

memset(&s_addr, 0 , sizeof(struct sockaddr_in));//将s_addr清空

s_addr.sin_family = AF_INET;

s_addr.sin_port = htons(7838);

s_addr.sin_addr.s_addr = INADDR_ANY; //指示接收的数据IP,必须为此值,因为是广播,接收地址任意

if(-1 == (bind(sock, (struct sockaddr*)&s_addr, sizeof(s_addr)))){

std::cout<

perror(“bind”);

exit(EXIT_FAILURE);

}

else{

printf(“bind address to socket.\n”);

}

addr_len = sizeof(c_addr);

while(1){

len = recvfrom(sock, buff,sizeof(buff)-1, 0, (struct sockaddr*)&c_addr, &addr_len);//从服务端接收数据

if(len < 0){

perror(“recvfrom failed…”);

exit(EXIT_FAILURE);

}

buff[len]= ‘\0’;

printf(“receive come from %s:%d message:%s\n”,inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port),buff);

}

return 0;

}

receive端的CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.5)

project(UDPreceive)

set(CMAKE_CXX_STANDARD 11)

add_executable(UDPreceive main.cpp)

3 测试

有两种测试方法,一是用网线连接两台电脑,一台执行发送端,另一台执行接受端。

二是在一台电脑上自发自收(需要将IP设定为127.0.0.1)。

这里演示第二种方法。编译完后在两个终端分别运行可执行文件:

发送端:

./UDP 127.0.0.1

接受端:

./UDPreceive

效果:

fa29a58ce52ded0e1c8b6ce1d5b47093.png

标签:UDP,addr,int,demo,struct,linux,include,socket

来源: https://blog.csdn.net/qq_43145072/article/details/96481235