C/S架构学习之基于UDP的本地通信(服务器)

  • 基于UDP的本地通信(服务器):
  • 创建流程:
  • 一、创建数据报式套接字(socket函数):
c 复制代码
		int sock_fd = socket(AF_UNIX,SOCK_DGRAM,0);
	    if(-1 == sock_fd)
	    {
	        perror("socket error");
	        exit(-1);
	    }
  • 二、创建服务器和客户机的本地网络信息结构体并填充服务器本地网络信息结构体 (struct sockaddr_un):
  • 本地网络信息结构体:
c 复制代码
	#include <sys/un.h>
	struct sockaddr_un {
	    sa_family_t sun_family;               //AF_UNIX
	    char        sun_path[108];            //pathname
	};
c 复制代码
		struct sockaddr_un serveraddr,clientaddr;
	    socklen_t serveraddr_len = sizeof(serveraddr);
	    socklen_t clientaddr_len = sizeof(clientaddr);
	
	    memset(&serveraddr,0,serveraddr_len);
	    memset(&clientaddr,0,clientaddr_len);
	
	    serveraddr.sun_family = AF_UNIX;
	    strcpy(serveraddr.sun_path,"./udpserver");
  • 三、绑定数据报式套接字(bind函数):
c 复制代码
		if(-1 == bind(sock_fd,(struct sockaddr *)&serveraddr,serveraddr_len))
	    {
	        perror("bind error");
	        exit(-1);
	    }
  • 四、服务器端收发数据(recvfrom函数、sendto函数):
c 复制代码
            memset(buf,0,sizeof(buf));
	
	        int ret1 = recvfrom(sock_fd,buf,sizeof(buf),0,(struct sockaddr*)&clientaddr,&clientaddr_len);
	        if(-1 == ret1)
	        {
	            perror("recvfrom error");
	            exit(-1);
	        }
	        printf("客户端[%s]发来消息[%s]\n",clientaddr.sun_path,buf);
	
	        //发送应答消息
	        strcat(buf,"---------k");
	
	        int ret2 = sendto(sock_fd,buf,sizeof(buf),0,(struct sockaddr *)&clientaddr,clientaddr_len);
	        if(-1 == ret2)
	        {
	            perror("sendto error");
	            exit(-1);
	        }
	
  • 五、关闭套接字(close函数):
c 复制代码
	close(sock_fd);
  • 示例代码:
c 复制代码
	#include <stdio.h>
	#include <string.h>
	#include <stdlib.h>
	
	#include <sys/socket.h>
	#include <sys/types.h>
	
	#include <unistd.h>
	#include <stdbool.h>
	#include <sys/un.h>
	
	#include <arpa/inet.h>
	#include <netinet/ip.h>
	
	int main(int argc, char const *argv[])
	{
	    //创建套接字
	    int sock_fd = socket(AF_UNIX,SOCK_DGRAM,0);
	    if(-1 == sock_fd)
	    {
	        perror("socket error");
	        exit(-1);
	    }
	    //填充网络信息结构体
	
	    struct sockaddr_un serveraddr,clientaddr;
	    socklen_t serveraddr_len = sizeof(serveraddr);
	    socklen_t clientaddr_len = sizeof(clientaddr);
	
	    memset(&serveraddr,0,serveraddr_len);
	    memset(&clientaddr,0,clientaddr_len);
	
	    serveraddr.sun_family = AF_UNIX;
	    strcpy(serveraddr.sun_path,"./udpserver");
	
	
	    //绑定套接字
	    if(-1 == bind(sock_fd,(struct sockaddr *)&serveraddr,serveraddr_len))
	    {
	        perror("bind error");
	        exit(-1);
	    }
	
	    printf("基于UDP的本地通信服务器启动!!!\n");
	
	    char buf[128] = {0};
	    //收发数据
	    while(true)
	    {
	        memset(buf,0,sizeof(buf));
	
	        int ret1 = recvfrom(sock_fd,buf,sizeof(buf),0,(struct sockaddr*)&clientaddr,&clientaddr_len);
	        if(-1 == ret1)
	        {
	            perror("recvfrom error");
	            exit(-1);
	        }
	        printf("客户端[%s]发来消息[%s]\n",clientaddr.sun_path,buf);
	
	        //发送应答消息
	        strcat(buf,"---------k");
	
	        int ret2 = sendto(sock_fd,buf,sizeof(buf),0,(struct sockaddr *)&clientaddr,clientaddr_len);
	        if(-1 == ret2)
	        {
	            perror("sendto error");
	            exit(-1);
	        }
	
	
	    }
	    //关闭套接字
	    close(sock_fd);
	
	    return 0;
	}
  • 运行结果:
c 复制代码
	基于UDP的本地通信服务器启动!!!
	客户端[./udpclient]发来消息[hello]
	客户端[./udpclient]发来消息[I Love China!!!]
	客户端[./udpclient]发来消息[miss U]
  • 特别注意:
  • strcpy(serveraddr.sun_path,"./udpserver");udpserver文件套接字文件
  • 如下所示:
c 复制代码
	srwxrwxr-x 1 linux linux     0 11月 11 01:18 udpserver
相关推荐
咩咩啃树皮4 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
炸膛坦客4 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
爱写代码的森4 小时前
鸿蒙三方库 | harmony-utils之ImageUtil图片保存到本地详解
服务器·华为·harmonyos·鸿蒙·huawei
世人万千丶5 小时前
参数管理_Flutter在鸿蒙平台路由参数最佳实践
学习·flutter·华为·harmonyos·鸿蒙
CS创新实验室6 小时前
量子计算机的操作系统:原理、实践与经典架构之对比
架构·操作系统·量子计算
人间凡尔赛6 小时前
WAIC 2026 落幕,AI Agent 开发已进入 Harness 架构时代
人工智能·架构
极客侃科技7 小时前
制造企业 MES/APS 选型:SAP PP/DS 集成、ERP-MES 边界划分与一体化架构要点
运维·架构·制造
晏宁科技YaningAI7 小时前
VoIP系统的工程实现模型:从信令控制到媒体传输的完整架构解析
网络·人工智能·架构·系统架构·信息与通信
HLC++8 小时前
Linux的进程间通信
android·linux·服务器
剑之所向8 小时前
前后端分离架构
架构