基本UDP套接字编程

news/2024/11/28 22:34:27/

文章目录

  • 基本流程
  • recvfrom和sendto函数
  • 试着用用


基本流程

客户端

  • 创建套接字socket()
  • 填充服务器网路信息结构体
  • 通信recvfrom()/sendto()

服务器

  • 创建套接字
  • 填充服务器网路信息结构体
  • 将套接字与服务器网络信息结构体绑定bind()
  • 进行通信recvfrom()/sendto()

recvfrom和sendto函数

函数原型

#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buff, ssize_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);
ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t addrlen);

参数
sockfd:描述符
buff:指向读入或写出缓冲区的指针
nbytes:读入或写出的字节数
flags:标志位,0阻塞,MSG_DONTWAIT非阻塞
from:指向一个由该函数返回时填写数据报发送者的协议地址的套接字地址结构
to:指向含有数据报接收者的协议地址
addrlen:记录地址长度

试着用用

服务器

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>int main(int argc, char *argv[])
{int sockfd;struct sockaddr_in serveraddr, clientaddr;socklen_t addrlen = sizeof(serveraddr);char buf[100] = {0};sockfd = socket(AF_INET, SOCK_DGRAM, 0);serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(atoi(argv[2]));serveraddr.sin_addr.s_addr = inet_addr(argv[1]);bind(sockfd, (struct sockaddr *)&serveraddr, addrlen);while(1){if(recvfrom(sockfd, buf, 100, 0, (struct sockaddr*)&clientaddr, &addrlen) == -1){printf("recvfrom error\n");}printf("%s-%d: %s\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port), buf);strcat(buf, "hi!");if(sendto(sockfd, buf, 100, 0, (struct sockaddr *)&clientaddr, addrlen) == -1){printf("sendto error");}}return 0;
}

客户端

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>int main(int argc, char *argv[])
{int sockfd;struct sockaddr_in serveraddr;socklen_t addrlen = sizeof(serveraddr);serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(atoi(argv[2]));serveraddr.sin_addr.s_addr = inet_addr(argv[1]);sockfd = socket(AF_INET, SOCK_DGRAM, 0);char buf[100];while(1){fgets(buf, 100, stdin);buf[strlen(buf)-1] = '\0';sendto(sockfd, buf, 100, 0, (struct sockaddr*)&serveraddr, addrlen);memset(buf, 0, sizeof(buf));recvfrom(sockfd, buf, 100, 0, (struct sockaddr*)&serveraddr, &addrlen);printf("server: %s\n", buf);}return 0;
}

http://www.ppmy.cn/news/19307.html

相关文章

GROMACS 教程--水中的溶菌酶

GROMACS 教程–水中的溶菌酶 中文教程&#xff1a;http://jerkwin.github.io/ 英文教程&#xff1a;http://www.mdtutorials.com 此示例将指导新用户完成模拟系统的设置过程&#xff0c;该模拟系统在一盒水和离子中包含蛋白质&#xff08;溶菌酶&#xff09;。每个步骤都将包含…

java线程中断 interrupt

1. 线程的状态&#xff1a; new -> 创建完线程&#xff0c;但是还没有启动runnable -> 表示线程是活跃状态terminated -> 表示线程已经结束了线程在sleep的时候是什么状态&#xff1f;time-waited 2. stop 终止线程已经被淘汰 简单来说是因为&#xff1a;使用stop…

Redis持久化-RDB

Redis持久化-RDB 1.官方资料 在线文档 : https://redis.io/topics/persistence 2.Redis持久化方案 1.RDB&#xff08;Redis DataBase&#xff09; 2.AOF&#xff08;Append Of File&#xff09; 3.RDB是什么 在指定的时间间隔内将内存中的数据集快照写入磁盘&#xff0c…

在linux下安装docker

文章目录 目录 文章目录 前言 一、docker 二、使用步骤 1.环境准备 2.安装 三、配置阿里云镜像加速 四、卸载 总结 前言 一、docker 镜像&#xff08;image&#xff09;&#xff1a; docker镜像就好比是一个模板&#xff0c;可以通过这个模板来创建容器服务&#xff0c;tomc…

【C++】类和对象(上)---什么是类?

目录1.面向过程和面向对象初步认识2.类的引入2.1使用struct定义类3.类的定义3.1类的两种定义方式&#xff1a;3.2成员变量命名规则的建议3.3成员函数与成员变量定义的位置建议4.类的访问限定符及封装4.1访问限定符4.2封装5.类的作用域6.类的实例化7.类对象模型7.1如何计算类对象…

打造Spring Boot应用时常用到的轮子

文章目录前言万能的SpringBoot应用包含哪些组件?主要技术点SpringBoot应用常用的开源组件Spring内置工具类一些完整的SpringBoot的开源项目开源博客和社区优秀CMS开源电商Java awesome前言 如何打造一款完备的、可复制的SpringBoot应用&#xff1f; 所谓完备&#xff0c;就是…

前端艺术之毛玻璃-倾斜-日历

前端艺术之毛玻璃-倾斜-日历描述项目效果index.htmlindex.css描述 项目描述开发语言HTML、JavaScript、CSS库dyCalendarJS、vanilla-tiltEdge108.0.1462.54 (正式版本) (64 位) 该项目中需要使用到的库有&#xff1a; dyCalendarJS vanilla-tilt.js 是 JavaScript 中的一个平…

ARP渗透与攻防(六)之限制网速攻击

系列文章 ARP渗透与攻防(一)之ARP原理 ARP渗透与攻防(二)之断网攻击 ARP渗透与攻防(三)之流量分析 ARP渗透与攻防(四)之WireShark截获用户数据 ARP渗透与攻防(五)之Ettercap劫持用户流量 ARP限制网速攻击 大家没想到吧&#xff0c;ARP还能限制对方网速。当kali欺骗了网关和受…