首页 > 其他分享 >基于c语言的UDP客户端、服务端二合一基础代码

基于c语言的UDP客户端、服务端二合一基础代码

时间:2024-06-05 20:25:05浏览次数:16  
标签:UDP 字节 二合一 udp client socket include 服务端 addr

基于c语言的UDP客户端、服务端二合一基础代码

示意图:
image
准备好了吗,以下是基础代码:

/**************************************************************************************************************************************
*
*   字节序:数据以字节流的方式进行传输,底层都是采用二进制,字节流的顺序是由架构决定的,现在假设使用X86架构,是采用小端存储
*	网络字节序:
*	本地字节序:
*
*	大端存储:低地址存储高字节   当数据超过1个字节的时候才需要区分大端还是小端  假设int型 0x12345678   0x12  | 0x34  | 0x56 |  0x78
*	小端存储:低地址存储低字节   当数据超过1个字节的时候才需要区分大端还是小端  假设int型 0x12345678   0x78  | 0x56  | 0x34 |  0x12
*
*	设备A采用X86架构,所以设备A采用小端存储  待发送的数据 :0x12345678
*   设备B采用ARM架构,所以设备B采用大端存储  待接收的数据 :?
*
*   为了统一发送数据的格式,所以互联网传输的数据统一采用大端方式,为了方便开发,linux系统提供了转换的接口:htonl、htons、ntohl、ntohs
*
*   h :host  主机/本地
*   to:      转换
*   n :net   网络
*   l :long  长整型
*   s :short 短整型
*
*   htons:把本地字节序的一个短整型转换为网络字节序
*   htonl:把本地字节序的一个长整型转换为网络字节序
*   ntohs:把网络字节序的一个短整型转换为本地字节序
*   ntohl:把网络字节序的一个长整型转换为本地字节序
* ***********************************************************************************************************************************/
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <time.h>
#include <pthread.h>

#define  MULTICAST_ADDR "224.88.88.88"
//这里的宏定义是你自定义的广播组,如同聊天室需要在同一个频道

int udp_socket;

//客户端任务
void *client(void *arg)
{
	
	
		//2.向目标主机发送消息,需要设置目标端口和目标地址
		char buffer[128] = {0};
		
		struct sockaddr_in  dest_addr;
		dest_addr.sin_family 		= AF_INET; 						//协议族,是固定的
		dest_addr.sin_port   		= htons(9999);			//服务器端口,必须转换为网络字节序
		dest_addr.sin_addr.s_addr   = inet_addr(MULTICAST_ADDR);			//服务器地址 "192.168.64.xxx"  

		bind(udp_socket,(struct sockaddr *)&dest_addr, sizeof(dest_addr));//绑定服务器和端口

	while(1)
	{	
		printf("请输入内容:");
		scanf("%s",buffer);

		//3.发送客户端的上线时间
		sendto(udp_socket,buffer,strlen(buffer),0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
	}

}

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

	//检查参数有效性
	if (argc != 2)
	{
		fprintf(stderr, "argument is invaild ,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}

	//1.创建UDP套接字             
	udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
	if (udp_socket == -1)
	{
		fprintf(stderr, "udp socket error,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}


// 启用广播选项  
  
	//setsockopt(udp_socket, SOL_SOCKET, SO_BROADCAST, &broadcast, option_len);

	//getsockopt(udp_socket, SOL_SOCKET, SO_BROADCAST,(void *)&optval, &option_len);
  //----------------------------------------------------------------------------------------
	//2.需要先绑定服务器的端口和地址
	struct sockaddr_in  host_addr;

	struct ip_mreqn mreq;

	host_addr.sin_family 		= AF_INET; 						//协议族,是固定的
	host_addr.sin_port   		= htons(atoi(argv[1]));			//目标端口,必须转换为网络字节序
	host_addr.sin_addr.s_addr   = INADDR_ANY;		//目标地址 "192.168.64.xxx"  已经转换为网络字节序  INADDR_ANY

	bind(udp_socket,(struct sockaddr *)&host_addr, sizeof(host_addr));

  //----------------------------------------------------------------------------------------
	//加入多播组
    mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_ADDR);  
    mreq.imr_address.s_addr= htonl(INADDR_ANY); // 或者指定网络接口地址
	mreq.imr_ifindex = 0;
    setsockopt(udp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
  //----------------------------------------------------------------------------------------
    //创建客户端线程
	pthread_t hostser;
	pthread_create(&hostser,NULL,client,NULL);

    

	//3.调用recvfrom等待接收数据,并且接收客户端的网络信息
	char buf[128] = {0};
	struct sockaddr_in  client;
	socklen_t client_len = sizeof(client);

	while(1)
	{   
	    
		recvfrom(udp_socket,buf,sizeof(buf), 0 ,(struct sockaddr *) &client,&client_len); //默认会阻塞

		 // 输出消息内容  
        time_t now = time(NULL);  
        printf("client ip is [%s]  time:%s  %s\n", inet_ntoa(client.sin_addr), ctime(&now),buf);  
		bzero(buf,sizeof(buf));
	}
	
	return 0;

}

标签:UDP,字节,二合一,udp,client,socket,include,服务端,addr
From: https://www.cnblogs.com/zcx0326/p/18233701

相关文章

  • 基于c语言的TCP客户端、服务端基础代码
    基于c语言的TCP客户端、服务端基础代码基本流程:客户端:#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdio.h>#include<errno.h>#include<sys/socket.h>#include<netinet/in.h>#include<netinet/......
  • 用udp协议传输文件
    用udp协议传输文件目录用udp协议传输文件头文件/宏定义客户端服务器头文件/宏定义#include<stdio.h>#include<stdlib.h>#include<string.h>#include<arpa/inet.h>#include<netinet/in.h>#include<sys/types.h>#include<sys/socket.h>#include<ti......
  • 网络编程中UDP协议通信
    #include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<errno.h>#include<stdlib.h>#include<time.h>#include<string.h>#include<netinet/ip.h>#include<netinet/in.h>#include&......
  • eladmin-mp 低代码生成后台页面和服务端java代码接口调研
    概述总体这个项目前端使用vue2,后端使用springbootgit地址https://github.com/elunez/eladmin-mp预览地址https://eladmin.vip/demo/#/sys-tools/generator数据表配置低代码下载生成后的前端代码示例生成的后端代码示例:这里可以配置生成自动放在项目的目录......
  • TCP和UDP
    TCP和UDPTCP的可靠性特性序列号(Sequencing):TCP为每个传输的数据段分配一个唯一的序列号,接收端可以根据这些序列号重新组装数据。确认与重传(AcknowledgmentandRetransmission):TCP使用确认机制来确认数据段是否成功到达。如果接收端没有收到某个数据段,发送端会重传它。流量控......
  • UDP内网穿透和打洞原理的C语言代码实现
    v1.02024年6月5日发布于博客园目录序言UDP打洞的原理应用场景基本理论代码实现udp_client_NAT.cudp_server_NAT.c结果参考链接序言UDP打洞(UDPHolePunching)是一种用于在NAT(网络地址转换)设备后面建立直接P2P(点对点)连接的技术。NAT设备通常会阻止外部设备直接与内部设备通......
  • UDP协议的应用——域名解析
    设计程序实现解析www.baidu.com的域名,把获取到的百度的IP地址全部输出到终端并验证是否正确/*************************************************************************************************************************** filename: udp_cs.c* author :Dazz* d......
  • 网络编程练习题---利用UDP协议实现组播通信
    目录题目解析代码实现题目解析由于该题需要实现组播通信,所以我们需要将套接字文件句柄设置为组播属性,并将需要通信的用户端IP地址,加入组中。由于组播通信需要实现一对多发送消息,所以还需要将套接字文件句柄的广播属性一并开启。由于该题实现过程使用到了线程相关函数接口,所......
  • udp协议实现组播功能
    /****************************************************************************************************************************************filename:multicast.c*author:[email protected]*date:2024/06/04*brief:小组实现,小组中的每位......
  • UDP练习题——实现将自己加入到多播组中并等待服务器发送数据包
    设计程序,要求程序可以加入到一个多播组中并等待服务器发送,数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端,消息内容格,式「消息来源IP消息时间1:消息内容多播地址和端口号/*************************************************************************......