随笔小屋 Logo
首页
瞬间
反馈
随笔小屋 Logo
首页 瞬间 反馈
  1. 首页
  2. linux
  3. udp

udp

  • linux
  • 发布于 2025-11-19
  • 117 次阅读
flor
flor
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void* buf, size_t count, int flags, struct sockaddr* src_addr, socklen_t* addrlen);
功能:接收数据
参数:前四个参数和函数recv相同
    src_addr:输出源主机的地址信息
    addrlen:输入输出源主机的地址信息的字节数
返回值:成功返回实际接收的字节数,失败返回-1

include <sys/socket.h>
ssize_t sendto(int sockfd, void const* buf, size_t count, int flags,struct sockaddr const* dest_addr, socklen_t addrlen);
功能:发送数据
参数:前四个参数和函数send相同
    dest_addr:目的主机的地址信息。
    addrlen:目的主机的地址信息的字节数。
返回值:成功返回实际发送的字节数,失败返回-1
步骤 服务器 客户机 步骤
1 创建套接字 socket socket 创建套接字 1
2 准备地址结构 sockaddr_in sockaddr_in 准备地址结构 2
3 绑定地址 bind —— ——
4 接收请求 recvfrom sendto 发送请求 3
5 发送响应 sendto recvfrom 接收响应 4
6 关闭套接字 close close 关闭套接字 5
步骤 服务器操作 服务器函数 客户机函数 客户机操作 步骤
1 创建套接字 socket socket 创建套接字 1
2 准备地址结构 sockaddr in sockaddr in 准备地址结构 2
3 绑定地址 bind connect 建立连接 3
4 接收请求 recvfrom send/write 发送请求 4
5 发送响应 sendto recv/read 接收响应 5
6 关闭套接字 close close 关闭套接字 6
//基于udp的服务器
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>

int main(void){
    printf("服务器:创建套接字\n");
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd == -1){
        perror("socket");
        return -1;
    }
    printf("服务器:组织地址结构\n");
    struct sockaddr_in ser;
    ser.sin_family = AF_INET;
    ser.sin_port = htons(9090);
    ser.sin_addr.s_addr = inet_addr("192.168.249.129");

    printf("服务器:绑定套接字和地址结构\n");
    if(bind(sockfd,(struct sockaddr*)&ser,sizeof(ser)) == -1){
        perror("bind");
        return -1;
    }

    printf("服务器:业务处理\n");
    for(;;){
        //接收数据
        char buf[64] = {};
        struct sockaddr_in cli;//客户端地址结构
        socklen_t len = sizeof(cli);//地址结构大小
        if(recvfrom(sockfd,buf,sizeof(buf)-1,0,
                    (struct sockaddr*)&cli,&len) == -1){
            perror("recvfrom");
            return -1;
        }
        //转大写
        for(int i = 0;i < strlen(buf);i++){
            buf[i] = toupper(buf[i]);
        }
        //回传给客户端
        if(sendto(sockfd,buf,strlen(buf),0,
                (struct sockaddr*)&cli,len) == -1){
            perror("sendto");
            return -1;
        }
    }

    printf("服务器:关闭套接字\n");
    close(sockfd);
    return 0;
}
//基于udp的客户端
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>

int main(void){
    printf("客户端:创建套接字\n");
    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sockfd == -1){
        perror("socket");
        return  -1;
    }
    printf("客户端:组织服务器的地址结构\n");
    struct sockaddr_in ser;
    ser.sin_family = AF_INET;
    ser.sin_port = htons(9090);
    ser.sin_addr.s_addr = inet_addr("192.168.249.129");

    printf("客户端:业务处理\n");
    for(;;){
        char buf[64] = {};
        fgets(buf,sizeof(buf),stdin);

        if(strcmp(buf,"!\n") == 0){
            break;
        }

        if(sendto(sockfd,buf,strlen(buf),0,
                (struct sockaddr*)&ser,sizeof(ser)) == -1){
            perror("sendto");
            return -1;
        }

        if(recv(sockfd,buf,sizeof(buf)-1,0) == -1){
            perror("recv");
            return -1;
        }
        printf("%s",buf);
    }

    printf("客户端:关闭套接字\n");
    close(sockfd);
    return 0;
}

湘ICP备2025147565号-1
CPU --% | 内存 0.00G/0.00G (0%) | 网络 无活动网卡
服务器资源占用 更新时间 --:--:--