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;
	    clientaddr.sun_family = AF_UNIX;
	
	    strcpy(serveraddr.sun_path,"./udpserver");
	    strcpy(clientaddr.sun_path,"./udpclient");
  • 三、客户机绑定数据报式套接字(bind函数):、
c 复制代码
		if(-1 == bind(sock_fd,(struct sockaddr *)&clientaddr,clientaddr_len))
	    {
	        perror("bind error");
	        exit(-1);
	    }
  • 四、客户机端发收数据(sendto函数、recvfrom函数):
c 复制代码
			memset(buf,0,sizeof(buf));
	
	        fgets(buf,sizeof(buf),stdin);
	        buf[strlen(buf) - 1] = '\0';
	        int ret1 = sendto(sock_fd,buf,sizeof(buf),0,(struct sockaddr *)&serveraddr,serveraddr_len);
	        if(-1 == ret1)
	        {
	            perror("sendto error");
	            exit(-1);
	        }
	
	        int ret2 = recvfrom(sock_fd,buf,sizeof(buf),0,(struct sockaddr*)&serveraddr,&serveraddr_len);
	        if(-1 == ret2)
	        {
	            perror("recvfrom error");
	            exit(-1);
	        }
	
	        printf("服务器[%s]发来应答消息[%s]\n",serveraddr.sun_path,buf);
  • 五、关闭套接字(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;
	    clientaddr.sun_family = AF_UNIX;
	
	    strcpy(serveraddr.sun_path,"./udpserver");
	    strcpy(clientaddr.sun_path,"./udpclient");
	
	
	    //绑定套接字
	    if(-1 == bind(sock_fd,(struct sockaddr *)&clientaddr,clientaddr_len))
	    {
	        perror("bind error");
	        exit(-1);
	    }
	
	    printf("基于UDP的本地通信客户机启动!!!\n");
	
	    char buf[128] = {0};
	    //收发数据
	    while(true)
	    {
	        memset(buf,0,sizeof(buf));
	
	        fgets(buf,sizeof(buf),stdin);
	        buf[strlen(buf) - 1] = '\0';
	        int ret1 = sendto(sock_fd,buf,sizeof(buf),0,(struct sockaddr *)&serveraddr,serveraddr_len);
	        if(-1 == ret1)
	        {
	            perror("sendto error");
	            exit(-1);
	        }
	
	        int ret2 = recvfrom(sock_fd,buf,sizeof(buf),0,(struct sockaddr*)&serveraddr,&serveraddr_len);
	        if(-1 == ret2)
	        {
	            perror("recvfrom error");
	            exit(-1);
	        }
	
	        printf("服务器[%s]发来应答消息[%s]\n",serveraddr.sun_path,buf);
	
	
	
	    }
	    //关闭套接字
	    close(sock_fd);
	
	    return 0;
	}
  • 运行结果:
c 复制代码
	基于UDP的本地通信客户机启动!!!
	hello
	服务器[./udpserver]发来应答消息[hello---------k]
	I Love China!!!
	服务器[./udpserver]发来应答消息[I Love China!!!---------k]
	miss U
	服务器[./udpserver]发来应答消息[miss U---------k]
  • 特别注意:
  • strcpy(serveraddr.sun_path,"./udpserver");和strcpy(clientaddr.sun_path,"./udpclient");代码段中的udpserver文件、udpclient文件是套接字文件;
  • 如下所示:
c 复制代码
	srwxrwxr-x 1 linux linux     0 11月 11 01:18 udpclient
	srwxrwxr-x 1 linux linux     0 11月 11 01:18 udpserver
相关推荐
熊猫钓鱼>_>7 分钟前
面试出现 606 次的第 K 大,被拆成三个问题问
算法·面试·职场和发展·校招·面经·oj·ai生成
海宇AI11 分钟前
零信任架构实战:基于海宇运营商近3个月平均账单构建自动化免押租赁授信网关
运维·人工智能·架构·自动化
xuxigifxfh23 分钟前
牛客:BISHI2 【模板】栈的操作
java·开发语言·windows·算法
奕鼎竜瑆23 分钟前
无监督学习:聚类与降维
学习·数据挖掘·聚类
此生决int24 分钟前
Linux系列(06)——进程概念(上)
linux·运维·服务器
海宇服务29 分钟前
零信任架构实战:基于海宇股权穿透构建自动化招投标供应商关联排查网关
运维·人工智能·架构·自动化
aqiu11111139 分钟前
【C++算法打怪专栏】LeetCode 402. 移掉 K 位数字(单调栈 + 贪心)
c++·算法·leetcode
房开民43 分钟前
通俗总结 Octree(八叉树)
java·服务器·数据库
糖果豆豆1 小时前
对象是字段,还是关系?集合论和范畴论吵了三十年,答案是两个都对
算法·架构
听风若依1 小时前
函数栈帧的创建与销毁-重置版
c语言·学习