Linux下TCP、UDP、UDP广播通信代码及运行

2023-05-16

一、网络环境配置

网络通信方式可选择一台主机里的两个虚拟机,也可以两台主机里的两个虚拟机,本文采用方式二。

主机一IP地址为192.168.1.109

主机二IP地址为192.168.1.24

必须使两台主机在一个网段内,并且可以ping通才可进行以下操作。

二、TCP连接

客户端(主机一)代码

TCP_client.c

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[])
{
	unsigned short port = 8000; 
	char *server_ip = "192.168.1.24";   //设置第二个主机ip地址为服务器地址,进行TCP通信
	char send_buf[512] = "hello every!"; //设置发送的内容
	char recv_buf[512] = "";
	int sockfd = 0;
	int err_log = 0;
	struct sockaddr_in server_addr;
	if( argc > 1 ) 
		server_ip = argv[1];
	if( argc > 2 ) 
		port = atoi(argv[2]);
	bzero(&server_addr,sizeof(server_addr)); 
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(port);
	inet_pton(AF_INET, server_ip, &server_addr.sin_addr);
	sockfd = socket(AF_INET, SOCK_STREAM, 0); 
	if(sockfd < 0)
	{
		perror("socket");
		exit(-1);
	}
	err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
	if(err_log != 0)
	{
		perror("connect");
		close(sockfd);
		exit(-1);
	}
	send(sockfd, send_buf, strlen(send_buf), 0); 
	recv(sockfd, recv_buf, sizeof(recv_buf), 0); 
	printf("%s\n", recv_buf);
	close(sockfd);
	return 0;
}

服务器端(主机二)代码

TCP_server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
	char recv_buf[2048] = ""; 
	int sockfd = 0; 
	int connfd = 0;
	int err_log = 0;
	struct sockaddr_in my_addr; 
	unsigned short port = 8000; 
	if(argc > 1) 
		port = atoi(argv[1]);
	printf("TCP Server Started at port %d!\n", port);
	sockfd = socket(AF_INET, SOCK_STREAM, 0); 
	if(sockfd < 0)
	{
		perror("socket");
		exit(-1);
	}
	bzero(&my_addr, sizeof(my_addr)); 
	my_addr.sin_family = AF_INET;
	my_addr.sin_port = htons(port);
	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	printf("Binding server to port %d\n", port);
	err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
	if( err_log != 0)
	{
		perror("binding");
		close(sockfd);
		exit(-1);
	}
	err_log = listen(sockfd, 10);
	if(err_log != 0)
	{
		perror("listen");
		close(sockfd);
		exit(-1);
	}
	printf("Waiting client...\n");
	while(1)
	{
		size_t recv_len = 0;
		struct sockaddr_in client_addr; 
		char cli_ip[INET_ADDRSTRLEN] = ""; 
		socklen_t cliaddr_len = sizeof(client_addr); 
		connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len); 
		if(connfd < 0)
		{
			perror("accept");
			continue;
		}
		inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN);
		printf("client ip = %s\n", cli_ip);
		
		while((recv_len = recv(connfd, recv_buf, sizeof(recv_buf), 0)) > 0)
			send(connfd, recv_buf, recv_len, 0);
			printf("%s\n",recv_buf);
		close(connfd); 
		printf("client closed!\n");
	}
	close(sockfd); 
	return 0;
}

客户端输入代码

gcc TCP_client.c -o TCP_client
./TCP_clent

服务器端输入代码

gcc TCP_server.c -o TCP_server
./TCP_server

 三、UDP连接

 客户端(主机一)代码

UDP_client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main (int argc, char *argv[])
{
	int sockfd = 0;
	struct sockaddr_in server_addr;
	unsigned short port = 8000;
	char *ser_ip = "192.168.1.24";

	if(argc >1)
		ser_ip = argv[1];
	if(argc >2)
		port = atoi(argv[2]);
    
	sockfd = socket (AF_INET, SOCK_DGRAM, 0);
	if(sockfd < 0)
	{
		perror("socket error!");
		exit(-1);
	}

	bzero (&server_addr, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(port);
	inet_pton(AF_INET, ser_ip,&server_addr.sin_addr);

	printf("ready send data to UDP server %s:%d!\n",ser_ip,port);
	while (1)
	{
		char send_buf[2048] = "";
		int len = 0;

		fgets(send_buf, sizeof(send_buf),stdin);
		send_buf[strlen(send_buf)-1] ='\0';

		sendto(sockfd, send_buf, strlen(send_buf),0,(struct sockaddr*)&server_addr,sizeof(server_addr));

		len = recvfrom(sockfd, send_buf, sizeof(send_buf),0,NULL,NULL);
		printf("%s\n",send_buf);
	}
	close(sockfd);
	return 0;

}

服务器端(主机二)代码

UDP_server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
	int sockfd = 0;
	int error_log = 0;
	struct sockaddr_in bind_addr;
	unsigned short port = 8000;
    
	if (argc > 1)
		port = atoi(argv[1]);
	printf("UDP server Started!\n");

	sockfd = socket(AF_INET, SOCK_DGRAM,0);
	if (sockfd < 0)
	{
		perror("socket error");
		exit(-1);
	}

	bzero(&bind_addr, sizeof(bind_addr));
	bind_addr.sin_family = AF_INET;
	bind_addr.sin_port = htons(port);
	bind_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	
	printf("Binding server to port %d\n", port);
	error_log = bind(sockfd, (struct  sockaddr *)&bind_addr, sizeof(bind_addr));
  	if (error_log  != 0)
	{
		perror("bind error");
		close(sockfd);
		exit(-1);
	}

	printf("waiting data from other client...\n");
	while(1)
	{
		char recv_buf[1024] = "";
		char cli_ip[INET_ADDRSTRLEN] = "";
		int recv_len =0;
		struct sockaddr_in client_addr;
		socklen_t client_addr_len = sizeof(client_addr);

		recv_len = recvfrom(sockfd, recv_buf,sizeof(recv_buf), 0 ,(struct sockaddr*)&client_addr,&client_addr_len);

		inet_ntop(AF_INET, &client_addr.sin_addr,cli_ip,INET_ADDRSTRLEN);
		printf("clinet ip = %s\n", cli_ip);
		printf("recver message :%s\n",recv_buf);
		sendto(sockfd, recv_buf,recv_len,0,(struct sockaddr*)&client_addr,&client_addr_len);
	}
	close(sockfd);
  	return 0;
  
}

客户端输入代码

gcc UDP_client.c -o UDP_client
./UDP_client
hello

 服务器端输入代码

gcc UDP_server.c -o UDP_server
./UDP_server

 四、UDP广播

发送端(主机一)代码

send.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>

int main(){
	char msg[128] = "I am broadCast message from server!";
	
	struct sockaddr_in saddr, caddr;
	socklen_t slen, clen;
	int lfd, ret;

	lfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(lfd < 0){
		perror("socket create error");
		exit(1);
	}
	int flag = 1;
	setsockopt(lfd, SOL_SOCKET, SO_BROADCAST | SO_REUSEADDR, &flag, sizeof(flag) );

	caddr.sin_family = AF_INET;
	caddr.sin_port = htons(4001);
	caddr.sin_addr.s_addr = inet_addr("192.168.1.255");
	clen = sizeof(caddr);
	
		int n = sendto(lfd, msg, strlen(msg), 0, (struct sockaddr *)&caddr, clen);
		if(n  < 0){
			perror("sendto Error:");
			exit(1);
		}
		close(lfd);
	return 0;
}

接收端(主机二)代码

recv.c

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netdb.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<arpa/inet.h>
int main(){
	int sockListen;
	if((sockListen = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
		printf("socket fail\n");
		return -1;
	}
	int set = 1;
	setsockopt(sockListen, SOL_SOCKET, SO_REUSEADDR, &set, sizeof(int));
	struct sockaddr_in recvAddr;
	memset(&recvAddr, 0, sizeof(struct sockaddr_in));
	recvAddr.sin_family = AF_INET;
	recvAddr.sin_port = htons(4001);
	recvAddr.sin_addr.s_addr = INADDR_ANY;
	
	if(bind(sockListen, (struct sockaddr *)&recvAddr, sizeof(struct sockaddr)) == -1){
		printf("bind fail\n");
		return -1;
	}
	int recvbytes;
	char recvbuf[128];
	int addrLen = sizeof(struct sockaddr_in);
	if((recvbytes = recvfrom(sockListen, recvbuf, 128, 0,
		(struct sockaddr *)&recvAddr, &addrLen)) != -1){
		recvbuf[recvbytes] = '\0';
		printf("receive a broadCast messgse:%s\n", recvbuf);
	}else{
		printf("recvfrom fail\n");
	}
	close(sockListen);
	return 0;
}

发送端输入代码

gcc send.c -o send
./send

接收端输入代码

gcc recv.c -o recv
./recv

  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下TCP、UDP、UDP广播通信代码及运行 的相关文章

  • IIC通信总线寻址

    IIC的使用 IIC总线简介IIC通信时序IIC总线寻址 IIC总线简介 1 IIC总线是一种由PHILIPS公司开发的两线式串行总线 2 IIC在硬件上是时钟总线SCL和数据总线SDA两条线构成 3 器件连接到总线都是SCL连到一起 xf
  • 通过PCF8591读取电压值(AD转换)

    通过PCF8591读取电压值 xff08 AD转换 xff09 A D的主要指标常用A D器件 PCF8591PCF8591的控制字节 A D的主要指标 1 ADC的位数 xff1a n位ADC代表 xff0c 2的n次方个刻度 2 基准源
  • STM32的光敏传感器

    STM32的光敏传感器 简介硬件连接计算公式程序 简介 1 照射光敏二极管的光强不同 xff0c 通过光敏二极管的电流大小就不同 xff0c 所以可以通过检测电流大小 xff0c 达到检测光强的目的 利用这个电流变化 xff0c 我们串接一
  • MPU6050寄存器介绍

    MPU6050寄存器介绍 MPU6050寄存器介绍电源管理寄存器1 xff08 0X6B xff09 陀螺仪配置寄存器 xff08 0X1B xff09 加速度传感器配置寄存器 xff08 0X1C xff09 FIFO使能寄存器 xff0
  • (10)查看RGB摄像头和深度摄像头

    查看RGB摄像头和深度摄像头 RGB摄像头深度摄像头 1 小车开机 xff0c 连接wifi xff0c 远程登录 登录密码 xff1a dongguan ssh wheeltec 64 192 168 0 100 2 挂载 挂载密码 xf
  • (11)色块跟踪

    色块跟踪 一 查看色块追踪的文件位置 xff1a 在ros simple follower文件下的simple followe的Launch文件 二 可调整识别色块的阈值 xff0c 追踪过程中最大速度 xff0c 中距值 xff0c PI
  • (6)ROS与STM32之间的联系

    ROS与STM32之间的联系 简介两者之间的关系两者之间的通信ROS如何在代码层面去接收stm32发送过来的数据1 整体框架2 机器人底盘类3 构造函数4 主函数5 循环功能函数6 析构函数 简介 1 如何实现ROS与stm32之间的通信
  • keil 局部变量不能查看值,显示为not in scope

    关于编译器的优化 xff0c 参考网上的8051系列的说明如下 xff1a xfeff xfeff 0级优化 xff1a 1 常数折叠 xff1a 只要有可能 xff0c 编译器就执行将表达式化为常数数字的计算 xff0c 其中包括运行地址
  • 算法——均方根检波

    均方根检波 1 均方根检波技术2 高精度采样技术3 STM32的ADC4 程序工程文件 1 均方根检波技术 1 均值检波电路通常采用电容充放电电路作为平均值电路 2 由于输出为整流平均值 xff0c 要求电容充放电时间常数相等 3 电容充放
  • 二.LVGL学习——(lv_obj基础对象)

    二 LVGL学习 xff08 lv obj基础对象 xff09 1 介绍2 对象的工作机制3 对象的创建与删除4 Screen 屏幕对象5 实例代码 xff08 1 xff09 6 实例代码 xff08 2 xff09 1 介绍 LVGL是
  • 三.LVGL学习——(Buttons styles)

    三 LVGL学习 xff08 Buttons styles xff09 1 按钮对象样式 2 程序 定义三个lv style t变量 static lv style t style btn 按钮1按下前的样式变量 static lv sty
  • 51单片机串行通信原理

    51单片机串行通信原理 计算机通信串行通信异步通信同步通信数据传送速率传输方向 单片机串行口串行口特殊功能寄存器串行口控制寄存器SCON电源控制寄存器PCON 波特率的设定与计算 PC与多个单片机通信串口如何使用 计算机通信 计算机通信 x
  • 基于动态窗口法(DWA)的局部避障算法研究及MATALB的实现

    一 动态窗口法基本概念 1 1 速度采样空间 1 2 评价函数 二 基于Matlab的机器人局部避障仿真 一 动态窗口法基本概念 动态窗口方法 DynamicWindowApproach 是一种可以实现实时避障的局部规划算法 xff0c 通
  • ROS(python)如何实现1个节点同时订阅2个话题,并实现话题同步,调用同一个callback

    1 创建talker1 span class token comment usr bin env python span span class token comment license removed for brevity span s
  • java与c++的性能比较

    java与c 43 43 的性能比较 参考其他文章 一 从编译器的角度分析性能差异 许多程序员印象中可能认为c 43 43 相比较于java语言性能会更好一点 xff0c 运行速度会快一点 这其中主要是因为java刚出现的时候JIT编译技术
  • OO-数字串char*与数值int_double之间转换

    OO 数字串char 与数值int double之间转换 文章目录 OO 数字串char 与数值int double之间转换 一 任务描述二 TestCase 2 测试集 需要填空的代码源代码 xff08 可以复制在编译器里面自行调试 xf
  • Altium Designer 生成 BOM(Bill of Material)

    画好图后 xff0c 生成 BOM xff08 Bill of Material xff09 xff1a 1 选择 Reports xff08 报告 xff09 gt gt Bill of Materials 材料清单 2 选择BOM表表头
  • CAN总线协议:标准CAN和扩展CAN

    CAN通讯协议是一个载波侦听 基于报文优先级碰撞检测和仲裁 xff08 CSMA CD 43 AMP xff09 的多路访问协议 CSMA的意思是总线上的每一个节点在企图发送报文前 xff0c 必须要监听总线 xff0c 当总线处于空闲时
  • c++new操作符笔记

    c 43 43 new语句 功能 xff1a 堆区开辟一组数据 语法 xff1a new 数据类型 注意点 xff1a new创建的数据会返回该数据对应的类型指针 xff0c 另外堆区开辟的数据由程序员手动释放
  • 循环冗余校验

    循环冗余校验 xff08 CRC xff09 是一个错误检测码在数字常用网络和存储设备 xff0c 以检测到的原始数据的意外改变 进入这些系统的数据块将根据其内容的多项式除法运算的余数获得一个简短的校验值 在检索时 xff0c 将重复计算

随机推荐

  • 串口通讯(USART)

    对于通讯协议 xff0c 我们也以分层的方式来理解 xff0c 最基本的是把它分为物理层和协议层 物理层规定通讯系统中具有机械 电子功能部分的特性 xff0c 确保原始数据在物理媒体的传输 协议层主要规定通讯逻辑 xff0c 统一收发双方的
  • curl解析工具

    main span class token keyword package span span class token namespace com span class token punctuation span alone span c
  • c语言实现进制的转化

    编写一个函数实现数制的转换 xff0c 不用递归 xff0c 用数组实现 在主函数中输入一个十进制数 xff0c 输出相应的十六进制数 span class token macro property span class token dir
  • springboot项目多环境配置(详细步骤)

    说明 xff1a 使用springboot实现项目多环境配置 xff01 目录 一 application properties多环境配置二 application yaml多环境配置 一 application properties多环境
  • 二叉树递归遍历(C语言实现)

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • n&(1<<i)用法

    1 lt lt i 是将1左移i位 xff0c 即第i位为1 xff0c 其余位为0 xff1b 例如1 lt lt 2 则0001 gt 0100 n amp 1 lt lt i 是将左移i位的1与n进行按位与 xff0c 即为保留n的第
  • C++如何将数字常量转换为字符串

    头文件 xff1a include lt string gt 功能 xff1a 将数字常量转换为字符串 参数 xff1a value 返回值 xff1a 转换好的字符串 定义于头文件 std string to string int val
  • 动态数组(C语言)

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • STM32使用串口空闲中断接收不定长数据帧-USART_IT_IDLE使用(不使用DMA方式)

    STM32使用串口空闲中断接收不定长数据帧 USART IT IDLE使用 xff08 不使用DMA方式 xff09 前言串口空闲中断介绍清中断方法串口中断处理函数串口中断用到的全局变量定义串口初始化 xff08 使能接收中断 空闲中断 x
  • C语言编程规范

    一 头文件编程规范 三大原则 设计层面 xff1a 1 头文件中适合放置接口声明 xff0c 不适合放实现 2 头文件职责单一 3 头文件应向稳定的方向包含 八项规则 编码层面 xff1a 1 只能通过包含头文件的方式使用其他模块提供的接口
  • struct2数据传输格式错误

    n incompatible version 1 1 14 of the APR based Apache Tomcat Native library is installed while Tomcat requires version 1
  • 简单自定义协议的封包和解包

    简单自定义协议的封包和解包 一 通信协议1 百度百科的解释2 过于简单的通信协议引发的问题3 通信协议常见内容1 帧头2 设备地址 类型3 命令 指令4 命令类型 功能码5 数据长度6 数据7 帧尾8 校验码 4 通信协议代码实现 xff0
  • 如何计算C语言中结构体的大小:结构体内存对齐

    结构体的对齐规则 xff1a 1 第一个成员在与结构体变量偏移量为0的地址处 2 其他成员变量要对齐到某个数字 xff08 对齐数 xff09 的整数倍的地址处 xff08 对齐数 61 编译器默认的一个对齐数 与 该成员大小的较小值 xf
  • C语言实现大小端转换

    C语言实现大小端转换 xff1a 大端模式 xff1a 数据的高字节保存在内存的低地址中 xff0c 而数据的低字节保存在内存的高地址中 数字999 换算成补码就是 xff1a 0000 0011 1110 0111 xff0c 大端存储模
  • Flask全局拦截器&局部拦截器

    拦截器 在开发网站时 xff0c 不同路由下有可能需要做一些重复的判断 例如购物网站中管理员想要获取所有订单的信息 xff0c 需要首先判断管理员是否登录 xff0c 如果没有登录肯定是没有权限的 同理 xff0c 管理员的其他操作同样需要
  • C struct 简单实现 class

    以车为对象 xff0c 用C来写C 43 43 的class车 在C中没有类 xff0c 所以用struct来代替 xff0c 而class中对应的类对象函数就用函数指针来代替 span class token keyword typede
  • 2019年全国大学生电子设计竞赛综合测评题解析

    2019年全国大学生电子设计竞赛综合测评题解析 题目如下 xff0c 设计制作电路产生下列四路信号 xff1a 1 频率为19kHz 21kHz连续可调的方波脉冲信号 xff0c 幅度不小于3 2V xff1b 2 与方波同频率的正弦波信号
  • char转string

    在平常做算法题的时候 xff0c 经常会碰到遍历字符串 xff0c 然后将在将目前遍历的子串与已经遍历过的进行其他操作时 xff0c 我们需要将子串由char类型转换为string类型 以下是几种简单的方法 1 使用赋值 61 includ
  • 进程和线程、单线程、多线程和多进程

    欢迎学习交流 xff01 xff01 xff01 持续更新中 文章目录 进程和线程理论知识二者区别 单线程和多线程多线程和多进程 进程和线程 由于理论概念难以理解 xff0c 我在查资料的过程中经常能看到这样一个形象的比喻 xff1a 进程
  • Linux下TCP、UDP、UDP广播通信代码及运行

    一 网络环境配置 网络通信方式可选择一台主机里的两个虚拟机 xff0c 也可以两台主机里的两个虚拟机 xff0c 本文采用方式二 主机一IP地址为192 168 1 109 主机二IP地址为192 168 1 24 必须使两台主机在一个网段