【C语言】实现linux下基于C语言的一个简单的UDP客/服端通信

news2025/2/22 19:00:16

一、实例代码

对于基础好的朋友可以直接拿代码看

客户端代码:

#include <stdio.h>
#include <sys/socket.h>//socket()
#include <netinet/in.h>//struct sockaddr_in
#include <string.h>//memset()
#include <arpa/inet.h>//inet_addr()
#include <unistd.h>//close()

#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 12345

int main()
{
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd == -1)
    {
        perror("create socket failed\n");
        return -1;
    }

    /*定义服务端地址信息用于发送函数*/
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
    server_addr.sin_port = htons(SERVER_PORT);
    
    /*要发送的数据缓冲区*/
    char buf[1500];
    while(1)
    {
        memset(buf, 0, sizeof(buf));
        scanf("%s", buf);
        int sendlen = sendto(sockfd, buf, sizeof(buf), 0, (const struct sockaddr *)&server_addr, sizeof(server_addr));
        if(sendlen == -1)
        {
            perror("send failed\n");
            break;
        }
    }

    close(sockfd);
    return 0;
}

服务端代码:

#include <stdio.h>
#include <sys/socket.h>//socket()
#include <netinet/in.h>//struct sockaddr_in
#include <string.h>//memset()
#include <arpa/inet.h>//inet_addr()
#include <unistd.h>//close()

#define SERVER_PORT 12345

int main()
{
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd == -1)
    {
        perror("create socket failed\n");
        return -1;
    }

    /*绑定本端地址*/
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));

    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;//INADDR_ANY == inet_addr("0.0.0.0"),监听本地所有网卡地址
    server_addr.sin_port = htons(SERVER_PORT);

    int ret = bind(sockfd, (const struct sockaddr *)&server_addr, sizeof(server_addr));
    if(ret == -1)
    {
        perror("bind failed\n");
        close(sockfd);
        return -1;
    }

    struct sockaddr_in client_addr;//recvfrom函数会自动填充客户端的地址信息
    socklen_t c_addr_len = sizeof(client_addr);
    //接收数据的缓冲区
    char buf[1024];
    while(1)
    {
        memset(buf, 0, sizeof(buf));
        int recvlen = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&client_addr, &c_addr_len);
        if(recvlen == -1)
        {
            perror("recv falied\n");
            break;
        }
        else if(recvlen == 0)
        {
            perror("connection reset by peer\n");
            break;
        }
        else
        {
            printf("recv:%s\n", buf);
        }
    }

    close(sockfd);

    return 0;
}

二、函数接口解析

1. sendto函数
ssize_t sendto(socket s, const void * msg, int len, unsigned int flags,
      const struct sockaddr * to, int tolen);
功能:
  通过已创建的socket向第五个参数中的地址发送数据
参数:
  s:一个udp的socket描述符,可以通过socket()函数创建
  msg:存储发送数据的缓冲区
  len:缓冲区长度
  flags:类型为int,控制位,指定是否接受带外数据和是否预览报文,默认为0
  to:目的地址的网络地址信息结构体指针
  tolen:类型为&int,地址的字节长度的指针
返回值:
  成功返回发送的字节数,失败返回 -1,使用perror或者打印全局变量errno可以打印出失败原因

EBADF 错误原因是第一个参数未指定合法的描述符
ENOTSOCK 错误原因是第一个参数未指定一个套接字描述符
EFAULT 错误原因是参数msg不正确
EMSGSIZE 错误原因是报文对套接字而言太大了
EWOULDBLOCK 错误原因是套接字没有数据,但是已经北指定为非阻塞I/O
ENOBUFS 错误原因是系统没有足够的资源完成操作

2.recvfrom函数
ssize_t recvfrom(int sockfd, void *buf, size_t len, unsigned int flags,
         struct sockaddr *from, socklen_t *fromlen);
功能:
  从套接字获取报文,并将对端网络地址填充到第五个参数中
参数:
  sockfd:由socket()函数创建的套接字描述符
  buf:存放报文的缓冲区地址
  len:缓冲区长度
  flags:控制位,指明是否接受带外数据和是否预览报文,默认为0
  from:存放发送方地址结构体的地址
  fromlen:发送方地址的大小
返回值:
  成功返回接收到的报文大小,失败返回-1,使用perror或者打印全局变量errno可以打印出失败原因

EBADF 错误原因是第一个参数没有指定合法的描述符
ENOTSOCK 错误原因是第一个参数没有指定一个套接字描述符
EWOULDBLOCK 错误原因是套接字没有数据,但是已经被设定为非阻塞I/O
EINTR 错误原因是在读操作进行时,被信号所中断
EFAULT 错误原因是参数buffer不正确

三、代码效果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字化转型中的抉择:定制化软件还是引入PDM系统?

企业在数字化转型过程中可以考虑是使用定制化软件、基于成熟模块改造&#xff0c;或引入PDM&#xff08;产品数据管理&#xff09;系统&#xff0c;这时需要仔细权衡各种因素&#xff0c;以确保选择最适合其需求的路径。这些选择各自有其优势和适用场景&#xff0c;下面将分别对…

Linux项目部署

目录 一JAVAWeb环境的部署【安装JDK&#xff0c;MySQL数据库&#xff0c;Tomcat】 二.手工部署SpringBoot项目&#xff08;写的最好的&#xff09; 1.在IDEA中开发SpringBoot项目并打成jar包--点击右侧的Maven执行package命令 2.将jar包上传到Linux服务器 3.执行以下命令&a…

探究Spring事务:了解失效场景及应对策略

在现代软件开发中&#xff0c;数据的一致性和完整性是至关重要的。为了保证这些特性&#xff0c;Spring框架提供了强大的事务管理机制&#xff0c;让开发者能够更加自信地处理数据库操作。然而&#xff0c;事务并非银弹&#xff0c;存在一些失效的情景&#xff0c;本文将带您深…

C++ Visual Studio工程目录相对路径设置

文章目录 相对路径相对路径是相对vs工程的哪个目录而言书写格式 参考 相对路径 要设对相对路径&#xff0c;需要搞清楚下面两个问题&#xff1a; 相对路径是相对vs工程的哪个目录而言相对路径的书写格式 相对路径是相对vs工程的哪个目录而言 注意&#xff1a; 并非以解决方案…

LeetCode150道面试经典题-买卖股票的最佳时机(简单)

1、题目 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…

麻了!包含中科院TOP,共16本期刊被标记为“On Hold”状态!

近日&#xff0c;小编从科睿唯安旗下的“Master Journal List”官网查到&#xff0c;除了知名老牌期刊Chemosphere竟然被标记为“On Hold”状态&#xff0c;目前共有7本SCI期刊&#xff0c;1本SSCI期刊&#xff0c;8本ESCI期刊被标记为“On Hold”&#xff0c;究竟是怎么回事呢…

一篇Android 真实面经(干货满满)

如梦朦胧 从年初开始就一直有换工作的躁动&#xff0c;因某些原因而拖到了现在,然后投了某度的Android岗位,本以为像我这种非211、985没工作经验的渣渣只能被直接pass,结果却意外的收到了电话,真是受宠若惊.经过电面,技术三面,然后就是等通知到最后拿到了OFFER,如梦一般,真是挺…

python小程序代码50 到100行,python小程序代码100行

这篇文章主要介绍了python小程序代码50 到100行&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 目录 1.生成漂亮的樱花树2.绝美的静态樱花树3.魔法少女小圆动漫形象4.利用pyth…

【注册表】windows系统注册表常用修改方案

文章目录 ◆ 修改IE浏览器打印页面参数设置◆气泡屏幕保护◆彩带屏幕保护程序◆过滤IP(适用于WIN2000)◆禁止显示IE的地址栏◆禁止更改&#xff29;&#xff25;默认的检查(winnt适用)◆允许DHCP(winnt适用)◆局域网自动断开的时间(winnt适用)◆禁止使用“重置WEB设置”◆禁止更…

SHGetFileInfo函数获取48x48图标并在ListControl平铺视图中显示

VS2010工程下载链接&#xff1a;https://pan.baidu.com/s/1ACXQSpoNdFVFLdvWntT7mA?pwdwfy5 C语言写法&#xff1a; #define COBJMACROS #include <stdio.h> #include <Windows.h> #include <CommCtrl.h> #include <commoncontrols.h>HICON load_ic…

Cocos基本介绍

一、下载Dashboard Cocos Creator 3.8 手册 - 安装和启动 二、编辑器结构 1.资源管理器&#xff1a;显示了项目资源文件夹(assets)中的所有资源 2.场景编译器&#xff1a;用于展示和编辑场景中可是内容的工作区域 3.层级管理器&#xff1a;用树状列表的形式展示场景中的所有…

Linux文件读取

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>int main(int argc, char * * argv){printf("输入了参数个数&#xff1a;%d \n",argc);if (argc !3 ){printf("参数不…

系统架构设计专业技能 · 软件工程(一)【系统架构设计师】

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

python接口自动化之正则用例参数化

前言 ​ 我们在做接口自动化的时候&#xff0c;处理接口依赖的相关数据时&#xff0c;通常会使用正则表达式来进行提取相关的数据。 ​ 正则表达式&#xff0c;又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(Regular Expression&#xff0c;在代码中常简写…

目标检测YOLOv3基于DarkNet53模型测试-笔记

目标检测YOLOv3基于DarkNet53模型测试-笔记 预测和试测结果&#xff1a; 预测代码如下所示&#xff1a; testInsects.py #YOLOv3网模型测试-单图片文件测试并显示测试结果 import time import os import paddle import numpy as np import cv2 import random from PIL impor…

ROS实现自定义信息以及使用

常见的消息包 消息包定义一般如下&#x1f447; &#xff08;1&#xff09;创建包和依赖项 &#xff08;2&#xff09;在新建的qq_msgs的包新建msgs的文件夹&#xff0c;在该文件夹里面新建Carry.msg类型的文件。 其实&#xff0c;Carry.msg就是你自己定义的消息类型&am…

CentOS软件包管理rpm、yum

一、软件包概述 Linux常见软件包分为两种&#xff0c;分别是源代码包、二进制文件包。源代码包是没有经过编译的包&#xff0c;需要经过GCC、C编译器编译才能运行&#xff0c;文件内容包含源代码文件&#xff0c;通常以.tar.gz、.zip、.rar结尾&#xff1b;二进制包无需编译&am…

尚硅谷大数据项目《在线教育之采集系统》笔记003

视频地址&#xff1a;尚硅谷大数据项目《在线教育之采集系统》_哔哩哔哩_bilibili 目录 P036 P037 P038 P039 P041 P042 P043 P044 P045 P046 P036 先启动zookeeper&#xff0c;在启动kafka&#xff0c;启动hadoop中的hdfs node003启动flume&#xff0c;node001启动f…

用户稳定增长,拆解美团立足于“吃”的刚需价值

近期&#xff0c;QuestMobile发布了《中国移动互联网2023年上半年大报告》。报告显示&#xff0c;上半年&#xff0c;我国移动互联网月人均单日使用时长同比增长7.7%至7.2小时&#xff0c;移动互联网月活用户增长至12.13亿。 尽管在几年前&#xff0c;互联网流量触顶就已经成为…

re学习(30)攻防世界-hackme(代码复原2)

思路&#xff1a; 1.输出成功&#xff0c;v26不为0,说明关系式&#xff1a;v21((unsigned __int8)v24 ^ v20) →2.在汇编代码第37行&#xff0c;输入v16v20&#xff0c;所以求的值为v20 →3.根据关系式&#xff0c;求的值v20v21^v24 →4.v21在第汇编代码第36行也可以提取出来…