C语言笔记-26-网络-UDP网络编程

C语言笔记-26-网络-UDP网络编程



前言

自学笔记,没有历史知识铺垫(省略百度部分)C语言笔记-26-网络-UDP网络编程


一、UDP编程模型概括

服务器端编程模型

  1. socket() 创建socket设备,获取该设备的文件描述符 sfd
  2. bind()将sfd与本地ip、端口绑定
  3. recvfrom()阻塞等待客户端
  4. do Some...处理客户端数据
  5. sendto() 将结果返回给客户端
  6. close()关闭连接描述符,结束通讯

客户端编程模型

  1. socket() 创建socket设备,获取该设备文件描述符 cfd
  2. sendto() 发送数据给服务器
  3. recvfrom()阻塞接收服务器数据
  4. do Some...处理服务器响应信息
  5. close()关闭本次连接,结束通讯

三、UDP编程模型代码

UDP服务端

#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>

int main(int argc, char *argv[])
{
    printf("服务器端启动中...\n");

    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8089);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    // 1. 创建socket设备
    int sfd = socket(PF_INET, SOCK_DGRAM, 0);
    if (sfd == -1)
    {
        perror("创建socket设备失败");
    }

    // 2. 绑定socket设备到ip、端口
    int bindResult = bind(sfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
    if (bindResult == -1)
    {
        perror("绑定socket设备失败");
    }

    char buf[128];
    while (1)
    {
        // 客户端地址信息
        struct sockaddr rec_addr;
        socklen_t len = sizeof(rec_addr);

        // 3. 阻塞等待客户端
        int recvFromResult = recvfrom(sfd, buf, 128, 0, &rec_addr, &len);
        if (recvFromResult == -1)
        {
            perror("阻塞等待客户端失败");
        }

        // 4. 处理客户端数据
        for (int i = 0; i < recvFromResult; i++)
        {
            buf[i] = toupper(buf[i]);
        }

        // 5. 阻塞等待客户端
        sendto(sfd, buf, recvFromResult, 0, &rec_addr, len);

        // 6. 关闭本次客户端链接
        close(recvFromResult);
    }

    return 0;
}

// 启动执行结果
dony15$ ./server_socket 
服务器端启动中...

UDP客户端

#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    char *msg = "Send Data abccc\n";
    char buf[128];
    printf("客户端启动中...\n");

    struct sockaddr_in client_addr;
    client_addr.sin_family = AF_INET;
    client_addr.sin_port = htons(8089);
    client_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    inet_pton(AF_INET, argv[1], &client_addr.sin_addr);

    // 1. 创建socket设备
    int cfd = socket(PF_INET, SOCK_DGRAM, 0);
    if (cfd == -1)
    {
        perror("创建socket设备失败");
    }

    // 2. 发送数据给服务器
    int sendtoResult = sendto(cfd, msg, strlen(msg) + 1, 0, (struct sockaddr *)&client_addr, sizeof(client_addr));
    if (sendtoResult == -1)
    {
        perror("向服务器发送数据失败");
    }

    // 3. 阻塞接收服务器数据
    int recvFromResult = recvfrom(cfd, buf, 128, 0, NULL, NULL);
    if (recvFromResult == -1)
    {
        perror("阻塞等待服务器返回数据失败");
    }

    // 4. 处理服务器响应信息
    write(1, buf, recvFromResult);

    // 5. 关闭本次客户端链接
    close(cfd);
    printf("\n客户端运行结束\n");

    return 0;
}

// 启动执行结果
dony15$ ./client_socket 127.0.0.1
客户端启动中...
SEND DATA ABCCC

客户端运行结束

总结

本章主要为C语言笔记-26-网络-UDP网络编程

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值