当前位置: 首页 > news >正文

使用udp进行通信

UDP chat

头文件

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

服务端server

typedef struct sockaddr *(SA);
int main(int argc,char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");return 1;}struct sockaddr_in server,client;bzero(&server,sizeof(server));bzero(&client,sizeof(client));server.sin_family = AF_INET;server.sin_port = htons(50000);server.sin_addr.s_addr = 0;int ret = bind(sockfd,(SA)&server,sizeof(server));if(-1 == ret){perror("bind");exit(1);}char buf[512] = {0};socklen_t len = sizeof(client);recvfrom(sockfd,buf,sizeof(buf),0,(SA)&client,&len);printf("cli addr:%s port:%s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));pid_t pid = fork();if(pid>0){while(1){bzero(buf,sizeof(buf));recvfrom(sockfd,buf,sizeof(buf),0,(SA)&client,&len);if(0==strcmp(buf,"#quit\n")){kill(pid,2);exit(1);}    printf("from cli:%s\n",buf);fflush(stdout);}}else if(0 == pid){while(1){bzero(buf,sizeof(buf));printf("to cli:");fgets(buf,sizeof(buf),stdin);sendto(sockfd,buf,strlen(buf),0,(SA)&client,sizeof(client));if(0 == strcmp(buf,"#quit\n")){kill(getppid(),2);exit(1);}}}else{perror("fork");exit(1);}return 0;}

客户端client

typedef struct sockaddr * (SA);struct sockaddr_in server;
void* th1(void* arg)
{int sockfd  = *(int*)arg;while(1){char buf[512]={0};recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);if(0 == strcmp(buf,"#quit\n")){exit(0);}printf("from ser:%s\n",buf);}return NULL;
}
void* th2(void* arg)
{int sockfd  = *(int*)arg;while(1){char buf[512]={0};printf("to ser:");fgets(buf,sizeof(buf),stdin);sendto(sockfd,buf,strlen(buf),0,(SA)&server,sizeof(server));if(0 == strcmp("#quit\n",buf)){exit(0);}}return NULL;
}int main(int argc, char *argv[])
{int sockfd  =socket(AF_INET,SOCK_DGRAM ,0);if(-1 == sockfd){perror("socket");return 1;}//set ip port  man 7 ip bzero(&server,sizeof(server));server.sin_family  = AF_INET;server.sin_port  = htons(50000);// >50000 host to net short server.sin_addr.s_addr =0;char buf[512]="@_@";sendto(sockfd,buf,strlen(buf),0,(SA)&server,sizeof(server));pthread_t tid1,tid2;pthread_create(&tid1,NULL,th1,&sockfd);pthread_create(&tid2,NULL,th2,&sockfd);pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;
}

函数

socket

int socket(int domain, int type, int protocol);
  • domain: 指定通信协议族,这里使用的是AF_INET,表示使用IPv4协议。
  • type: 指定套接字类型,SOCK_DGRAM表示使用数据报套接字,也就是UDP协议。
  • protocol: 通常为0,表示选择默认协议,对于SOCK_DGRAM来说,默认的协议就是UDP。

创建udp套接字  int sockfd = socket(AF_INET, SOCK_DGRAM, 0)

sockfd = socket(int socket_family, int socket_type, int protocol);

bzero

bzero 是一个用于将指定内存区域清零的函数,通常用于初始化数据结构,以确保它们不包含任何未初始化的数据。

void bzero(void *s, size_t n);
  • s: 指向需要清零的内存区域的指针。
  • n: 要清零的字节数。

bzero 将从指针 s 所指向的内存区域开始的 n 个字节全部设置为零。

struct sockaddr_in server;
bzero(&server, sizeof(server));

bzero 在网络编程中初始化 sockaddr_in 结构体:

bzeroserver 结构体的所有字节都设置为零,确保其中的每个字段都被正确初始化。使用 bzero 比逐个字段手动初始化要简单得多。

sendto

sendto 是一个用于发送数据到指定目标地址的函数,常用于UDP(数据报套接字)的网络编程。与TCP不同,UDP是无连接的协议,使用sendto函数可以在不建立连接的情况下发送数据。

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
  • sockfd: 套接字文件描述符,表示通过哪个套接字发送数据。
  • buf: 指向要发送的数据的指针。
  • len: 要发送的数据的长度(字节数)。
  • flags: 一般设置为 0,除非需要设置特殊的发送选项。
  • dest_addr: 指向目的地址的指针,即目标主机的地址和端口信息。这个地址通常使用 sockaddr_in 结构体表示。
  • addrlen: dest_addr 结构体的大小,通常使用 sizeof(struct sockaddr_in)

recvfrom

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
  • sockfd: 套接字文件描述符,指定从哪个套接字接收数据。
  • buf: 指向接收数据的缓冲区指针。
  • len: 缓冲区的大小(字节数),即可以接收的最大数据量。
  • flags: 通常设置为 0,除非需要特殊的接收行为(如非阻塞模式)。
  • src_addr: 用于存储发送方的地址信息的结构体指针(通常是 sockaddr_in 类型)。如果不关心发送方地址,可以设置为 NULL
  • addrlen: 一个指向 socklen_t 类型变量的指针,用于存储发送方地址的长度。如果 src_addrNULL,这个参数可以忽略。

bind

bind 函数在网络编程中用于将一个套接字(socket)绑定到一个特定的IP地址和端口号上。通常在服务器端程序中使用,以指定该服务器在某个IP地址和端口上监听客户端的连接或数据。

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd: 套接字文件描述符,指示要绑定的套接字。
  • addr: 指向包含IP地址和端口信息的 sockaddr 结构体的指针。对于IPv4,通常使用 sockaddr_in 结构体来表示。
  • addrlen: addr 结构体的大小,通常使用 sizeof(struct sockaddr_in)
  • 服务器端bind 是服务器端程序中必须的步骤之一,它将服务器的套接字绑定到一个特定的IP地址和端口上,以便客户端能够通过这个地址和端口与服务器通信。
  • 客户端:对于客户端程序,通常不需要手动调用 bind,因为系统会自动为客户端分配一个临时端口。然而,如果客户端希望指定特定的源IP地址或端口,也可以使用 bind

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 宏碁扩展Swift系列,推出四款全新AI笔记本电脑
  • 番外 1 : 安装 docker 和 docker-compose
  • Oracl查询报错:ORA-29275: 部分多字节字符
  • vscode spring boot项目编辑yaml不自动提示补全如何解决
  • 计算机网络13——IM聊天系统——网络功能实现——UDP
  • Oracle高级压缩和透明数据加密组合实验
  • CSS学习6
  • CSS中 特殊类型的选择器 伪元素如何使用
  • python文件自动化(4)
  • XMind v24 激活,简单一键激活
  • Spring、SpringMVC、SpringBoot都是什么,有什么区别
  • TinyWebSever源码逐行注释()_简单代码的整合
  • 将 x 减到 0 的最小操作数
  • 视觉语言模型(VLMs)知多少?
  • 【2024】MySQL库表基本操作
  • 网络传输文件的问题
  • 2018一半小结一波
  • Create React App 使用
  • css布局,左右固定中间自适应实现
  • ES6核心特性
  • Java精华积累:初学者都应该搞懂的问题
  • js操作时间(持续更新)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 给第三方使用接口的 URL 签名实现
  • 排序算法学习笔记
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • Java总结 - String - 这篇请使劲喷我
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (第二周)效能测试
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (四)c52学习之旅-流水LED灯
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (一)认识微服务
  • .net core 管理用户机密
  • .net core开源商城系统源码,支持可视化布局小程序
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .Net 路由处理厉害了
  • .netcore如何运行环境安装到Linux服务器
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET的微型Web框架 Nancy
  • .net分布式压力测试工具(Beetle.DT)
  • .NET学习教程二——.net基础定义+VS常用设置
  • @GetMapping和@RequestMapping的区别
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • []Telit UC864E 拨号上网
  • [30期] 我的学习方法
  • [AIGC] 广度优先搜索(Breadth-First Search,BFS)详解
  • [Angular 基础] - 表单:响应式表单
  • [BJDCTF2020]The mystery of ip1