Linux中UDP服务端和客户端

news/2024/11/24 7:31:39/

1 服务端代码

#include <stdio.h>
#include <head.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>#define PORT 6666 //端口号:1024~49191
#define IP "192.168.1.110"//"192.168.122.120"int main(int argc, const char *argv[])
{//创建报式套接字int sfd = socket(AF_INET, SOCK_DGRAM, 0);if(sfd < 0){ERR_MSG("socket");return -1;}printf("sfd = %d\n",sfd);//填充服务器自身的地址信息结构体,真实的地址信息结构体根据地址族制定//AF_INET : man 7 ipstruct sockaddr_in sin;sin.sin_family         = AF_INET;      //必须填AF_INETsin.sin_port           = htons(PORT);  //端口号:1024~49151sin.sin_addr.s_addr    = inet_addr(IP);//本机IP:ifconfig//绑定服务器的地址信息结构体到套接字上if(bind(sfd, (struct sockaddr*)&sin,sizeof(sin)) < 0){ERR_MSG("bind");return -1;}printf("bind success\n");char buf[128]="";ssize_t res=0;struct sockaddr_in cin;socklen_t addrlen= sizeof(cin);while(1){bzero(buf,sizeof(buf));//接收数据//res = recvfrom(sfd,buf,sizeof(buf),0,NULL,NULL);//res = recv(sfd,buf,sizeof(buf),0);//res = read(sfd,buf,sizeof(buf));res = recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);if(res < 0){ERR_MSG("recvfrom");return -1;}printf("[%s : %d] : %s\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);//buf[sizeof(buf)-1]=0;strcat(buf,"*_*");//发送数据if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin))<0){ERR_MSG("sendto");return -1;}printf("sendto success\n");}//关闭文件描述符close(sfd);return 0;
}

2 客户端代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <head.h>#define PORT 6666               //端口号:服务器绑定的端口号
#define IP "192.168.1.110"//"192.168.122.109"    //IP:服务器绑定的IPint main(int argc, const char *argv[])
{//创建报式套接字int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd < 0){ERR_MSG("socket");return -1;}printf("cfd = %d\n", cfd);//绑定客户端的地址信息结构体到套接字上---->非必须绑定//若不绑定,则操作系统会给客户端绑定运行主机的IP和随机端口//填充服务器的地址信息结构体,给sendto函数使用//要发给谁,就填谁的地址信息struct sockaddr_in sin;sin.sin_family      = AF_INET;      //必须填AF_INETsin.sin_port        = htons(PORT);      //端口号:服务器绑定的端口号                     sin.sin_addr.s_addr = inet_addr(IP);    //IP:服务器绑定的IPchar buf[128] = "";ssize_t res = 0;struct sockaddr_in rcvaddr;     //存储接收到的数据包从哪里来socklen_t addrlen = sizeof(rcvaddr);while(1){bzero(buf, sizeof(buf));printf("请输入>>> ");fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] = 0;//发送数据if(sendto(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin,  sizeof(sin)) < 0){ERR_MSG("sendto");return -1;}printf("sendto success\n");//接收数据res = recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&rcvaddr, &addrlen);//res = recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);//res = recv(cfd, buf, sizeof(buf), 0);//res = read(cfd, buf, sizeof(buf));if(res < 0){ERR_MSG("recvfrom");return -1;}printf("[%s : %d] : %s\n", \inet_ntoa(rcvaddr.sin_addr), ntohs(rcvaddr.sin_port), buf);}//关闭文件描述符close(cfd);return 0;
}

3 服务端结果

ubuntu@ubuntu:03_udp$ gcc 01_ser.c -o ser
ubuntu@ubuntu:03_udp$ ./ser
sfd = 3
bind success
[192.168.1.110 : 48368] : 123
sendto success
[192.168.1.110 : 48368] : 123
sendto success
[192.168.1.110 : 48368] : 123
sendto success
[192.168.1.110 : 48368] : 333
sendto success
^C
ubuntu@ubuntu:03_udp$ 

4 客户端结果

ubuntu@ubuntu:03_udp$ gcc 02_cli.c -o cli
ubuntu@ubuntu:03_udp$ ./cli
cfd = 3
请输入>>> 123
sendto success
[192.168.1.110 : 6666] : 123*_*
请输入>>> 123
sendto success
[192.168.1.110 : 6666] : 123*_*
请输入>>> 123
sendto success
[192.168.1.110 : 6666] : 123*_*
请输入>>> 333
sendto success
[192.168.1.110 : 6666] : 333*_*
请输入>>> ^C
ubuntu@ubuntu:03_udp$ 


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

相关文章

linux驱动1:点灯

1. 驱动&#xff1a; head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define RCC_MP_AHB4ENSETR 0X50000A28 #define GPIOE_MODER 0X50006000 #define GPIOE_ODR 0X50006014 #define GPIOF_MODER 0X50007000 #define GPIOF_ODR 0X50007014 #endifctu.c #include <linux/…

shopee运营新手入门教程!Shopee运营技巧!

​随着跨境电商行业的蓬勃发展&#xff0c;越来越多的人开始关注Shopee这个平台。短视频等渠道也成为了人们了解Shopee的途径。因此&#xff0c;对于许多新手来说&#xff0c;在Shopee上开店成为了一种吸引人的选择。为了帮助这些新手更好地入门&#xff0c;下面将介绍一下Shop…

基于长短期神经网络LSTM的居民用电量预测,基于长短期神经网络LSTM的居民用电负荷预测,基于LSTM的居民用电量预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的股票预测 MATALB编程实现,附有代码:基于长短期神经网络的居民用电负荷预测,基于LSTM的居民用电功率预测资源-CSDN文库 https://download.csdn.net/download/abc991835105/88184783 效果图 结果分析 展…

大数据课程J3——Scala的类定义

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Scala的柯里化 Currying; ⚪ 掌握Scala的类定义; ⚪ 掌握Scala的样例类、option类; ⚪ 掌握Scala的隐式转换机制; 一、柯里化 Currying 柯里化(Currying)技术 Christopher St…

MoCo论文精读

《 Momentum Contrast for Unsupervised Visual Representation Learning》 ---- MoCo 什么是对比学习? 对比学习是一种自我监督学习的范式。将未标记的样本相互对比,通过训练模型,使得属于同一分布的样本在嵌入空间中被推向彼此。 怎样知道那些图片类似,那些不类似呢? …

vue3-router

一、路由 &#xff08;1&#xff09;通过 URL 区分路由的机制上&#xff0c;有两种实现方式&#xff1a; hash 模式&#xff1a;通过 URL 中 # 后面的内容做区分&#xff0c;我们称之为 hash-router&#xff1b; history 模式&#xff1a;在这种方式下&#xff0c;路由看起来和…

form表单的entype属性选取

一、上传文件时entype属性值怎么选取&#xff1f; 上传文件的话必须指定form的enctype&#xff08;encode type&#xff0c;编码类型&#xff09;属性为multipart/form-data&#xff0c;表示表单数据有多部分组成&#xff0c;既有文本又有文件等二进制数据&#xff0c;指定…

UVM学习知识点

UVM构建 include 和 import pkg区别.sv .svhhdl_top.sv和hvl_top.sv回顾uvm_config&#xff0c;以及自定义uvm_configverilog:parameter、defparam与 localparamtest_basebuild_phaseend_of_elaboration_phasefunction void configure_agentset_seqsend_of_elaboration_phaseuv…