UDP客户端使用connect与UDP服务器使用send函数和recv函数收发数据

服务器代码编译运行

服务器udpconnectToServer.c的代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<errno.h>
#include<syslog.h> 
#include<signal.h>
#define    MAXLINE     4096static int count;static void quitHere(int signo) {printf("\nreceived %d datagrams\n", count);exit(0);
}int main(int argc, char **argv) {int socket_fd;socket_fd = socket(AF_INET, SOCK_DGRAM, 0);struct sockaddr_in server_addr;memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htonl(INADDR_ANY);server_addr.sin_port = htons(atoi(argv[1]));bind(socket_fd, (struct sockaddr *) &server_addr, sizeof(server_addr));socklen_t client_len;char message[MAXLINE];message[0] = 0;count = 0;signal(SIGINT, quitHere);struct sockaddr_in client_addr;client_len = sizeof(client_addr);// recvfrom会把客户端返回对端发送方的地址和端口等信息放到client_addr和client_len中int n = recvfrom(socket_fd, message, MAXLINE, 0, (struct sockaddr *) &client_addr, &client_len);if (n < 0) {fprintf(stderr, "error in recvfrom function: %s (%d)\n", strerror(errno), errno);}message[n] = 0;printf("received length is %d bytes \ncontent: %s\n", n, message);if (connect(socket_fd, (struct sockaddr *) &client_addr, client_len)) {fprintf(stderr, "connect error: %s (%d)\n", strerror(errno), errno);}while (strncmp(message, "quit", 4) != 0) {char send_line[MAXLINE];sprintf(send_line, "Hi, %s", message);size_t rt = send(socket_fd, send_line, strlen(send_line), 0);if (rt < 0) {fprintf(stderr, "send error: %s (%d)\n", strerror(errno), errno);}printf("send bytes: %zu \n", rt);size_t rc = recv(socket_fd, message, MAXLINE, 0);if (rc < 0) {fprintf(stderr, "recv error: %s (%d)\n", strerror(errno), errno);}count++;}exit(0);
}

gcc udpconnectserver.c -o udpconnectserver进行编译,./udpconnectserver 8080运行。

客户端代码编译与运行

客户端udpconnectToServer.c的代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<errno.h>
#include<syslog.h>
# define    MAXNUMBER     4096int main(int argc, char **argv) {if (argc != 3) {printf("usage: udpclient1 <IPaddress> or <Port>");}int socket_fd;socket_fd = socket(AF_INET, SOCK_DGRAM, 0);struct sockaddr_in server_addr;bzero(&server_addr, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(atoi(argv[2]));inet_pton(AF_INET, argv[1], &server_addr.sin_addr);socklen_t server_len = sizeof(server_addr);if (connect(socket_fd, (struct sockaddr *) &server_addr, server_len)) {printf("fail in connect");exit(1);}struct sockaddr *reply_addr;reply_addr = malloc(server_len);char sendLine[MAXNUMBER], receiveLine[MAXNUMBER + 1];socklen_t len;int n;while (fgets(sendLine, MAXNUMBER, stdin) != NULL) {int i = strlen(sendLine);if (sendLine[i - 1] == '\n') {sendLine[i - 1] = 0;}printf("send Content: %s\n", sendLine);size_t rt = send(socket_fd, sendLine, strlen(sendLine), 0);if (rt < 0) {printf("error in sending");}printf("send Content's bytes: %zu \n", rt);len = 0;receiveLine[0] = 0;n = recv(socket_fd, receiveLine, MAXNUMBER, 0);if (n < 0){if (errno){fprintf(stderr, "error in recvfrom: %s (%d)\n", strerror(errno), errno);}else{printf("recvfrom not success");}}receiveLine[n] = 0;fputs(receiveLine, stdout);fputs("\n", stdout);}exit(0);
}

gcc udpconnectToServer.c -o udpconnectToServer进行编译,./udpconnectToServer 127.0.0.1 8080运行。

实验

这里打开两个终端,然后连接到同一个机器上边。
然后在客户端发送一条信息good,可以看到服务器上收到了good并且给客户端发送了Hi, good
在这里插入图片描述

quit开头的字符串从客户端发送过来之后,就会让服务器关闭。
在这里插入图片描述

此文章为11月Day 23学习笔记,内容来源于极客时间《网络编程实战》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/212839.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HCIP---MPLS---LDP

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 MPLS 基于标签转发表进行转发&#xff0c;与路由表类似&#xff0c;标签转发表有两种获取渠道&#xff1a;一是手动配置(类似静态路由)&#xff0c;二是通过协议自动学习(类似OSPF)。手动配…

深入了解Java8新特性-日期时间API_LocalDate类

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概12000多字&#xff0c;预计阅读时间长需要10分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&…

使用C++从0到1实现人工智能神经网络及实战案例

引言 既然是要用C++来实现,那么我们自然而然的想到设计一个神经网络类来表示神经网络,这里我称之为Net类。由于这个类名太过普遍,很有可能跟其他人写的程序冲突,所以我的所有程序都包含在namespace liu中,由此不难想到我姓刘。在之前的博客反向传播算法资源整理中,我列举…

C++ Boost 实现异步端口扫描器

端口扫描是一种用于识别目标系统上哪些网络端口处于开放、关闭或监听状态的网络活动。在计算机网络中&#xff0c;端口是一个虚拟的通信端点&#xff0c;用于在计算机之间传输数据。每个端口都关联着特定类型的网络服务或应用程序。端口扫描通常是网络管理员、安全专业人员用来…

Go iota简介

当声明枚举类型或定义一组相关常量时&#xff0c;Go语言中的iota关键字可以帮助我们简化代码并自动生成递增的值。本文档将详细介绍iota的用法和行为。 iota关键字 iota是Go语言中的一个预定义标识符&#xff0c;它用于创建自增的无类型整数常量。iota的行为类似于一个计数器…

沃趣班11月月考题目解析

沃趣班11月月考题目解析 1.在oracle中创建用户时&#xff0c;若未设置default tablespace关键字&#xff0c;则oracle将哪个表空间分配给用户作为默认表空间 答案&#xff1a;D.user SQL> create user mytest identified by 123456; SQL> grant connect to mytest; SQL…

中国毫米波雷达产业分析2——毫米波雷达产业链分析

一、产业链构成 毫米波雷达产业链分为三部分&#xff1a;上游主要包括射频前端组件&#xff08;MMIC&#xff09;、数字信号处理器&#xff08;DSP/FPGA&#xff09;、高频PCB板、微控制器&#xff08;MCU&#xff09;、天线及控制电路等硬件供应商&#xff1b;中游主体是毫米波…

An issue was found when checking AAR metadata

一、报错信息 An issue was found when checking AAR metadata:1. Dependency androidx.activity:activity:1.8.0 requires libraries and applications that depend on it to compile against version 34 or later of the Android APIs.:app is currently compiled against …

由红黑树引出的HashMap扩容机制的思考

红黑树是什么&#xff1f; 三大特点&#xff1a; 根节点是黑色&#xff0c;叶节点是不存储数据的黑色空节点 任何相邻的两个节点不能同时为红色 任意节点到其可到达的节点间包含相同数量的黑色节点 联想&#xff1a;Java HashMap底层红黑树原理 HashMap基于哈希表Map接口实…

【C++干货铺】适配器 | stack | queue

个人主页点击直达&#xff1a;小白不是程序媛 C系列学习专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 stack的介绍和使用 stack的介绍 stack的使用 queue的介绍和使用 queue的介绍 queue的使用 容器适配器 什么是适配器 STL中stack和queue的底层结构 d…

前端工程、静态代码、Html页面 打包成nginx 的 docker镜像

1. 创建一个 mynginx的目录 2. 将前端代码文件夹&#xff08;比如叫 front &#xff09;复制到 mynginx 目录下 3. 在mynginx 目录下创建一个名为Dockerfile 的文件&#xff08;文件名不要改&#xff09;&#xff0c;文件内容如下&#xff1a; # 使用官方的 Nginx 镜像作为基…

蓝桥杯物联网竞赛_STM32L071_3_Oled显示

地位&#xff1a; 对于任何一门编程语言的学习&#xff0c;print函数毫无疑问是一种最好的调试手段&#xff0c;调试者不仅能通过它获取程序变量的运行状态而且通过对其合理使用获取程序的运行流程&#xff0c;更能通过关键变量的输出帮你验证推理的正确与否&#xff0c;朴素的…