Linux UDP 单任务服务端和客户端实现

安得情怀似旧时 2020-03-04

服务端

/*
 * main.c
 * 测试udp Socket套接字 单任务服务端代码实现
 *  Created on: 2020年3月4日
 *      Author: LuYonglei
 */

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

#define SERVER_PORT 9000   //服务器绑定的端口号

int main(int argc, char **argv) {
    //创建UDP套接字
    int socket_fd = socket(AF_INET, SOCK_DGRAM, 0); //创建UDP套接字,使用IPV4协议
    if (socket_fd < 0) {
        perror("socket_fd create failed");
        exit(1);
    }
    //绑定端口号
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET; //ipv4
    server_addr.sin_port = htons(SERVER_PORT); //设置端口号
    server_addr.sin_addr.s_addr = INADDR_ANY; //通配地址
    int ret = bind(socket_fd, (struct sockaddr*) (&server_addr),
            sizeof(struct sockaddr_in));
    if (ret < 0) {
        perror("bind ip failed");
        exit(1);
    }
    //接受客户端信息
    struct sockaddr_in client_addr; //保存的客户端的ip协议和端口号信息
    socklen_t client_addr_len; //长度
    while (1) {
        char receive_buf[128] = ""; //接收缓冲区
        recvfrom(socket_fd, receive_buf, sizeof(receive_buf), 0,
                (struct sockaddr*) (&client_addr), &client_addr_len); //接受客户端信息
        printf("%s\n", receive_buf); //打印客户端的信息
        sendto(socket_fd, receive_buf, strlen(receive_buf), 0,
                (struct sockaddr*) (&client_addr), client_addr_len); //把接受到的客户端信息再发送给客户端回显
    }
    close(socket_fd);
    return 0;
}

客户端

/*
 * main.c
 * 测试udp Socket套接字 客户端代码
 *  Created on: 2020年3月4日
 *      Author: LuYonglei
 */

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

#define SERVER_PORT 9000   //服务器端口号
const char *server_ip_addr = "127.0.0.1"; //服务器ip地址
/*
 * SOCK_STREAM  流式套接字,主要用于TCP
 * SOCK_DGRAM   报式套接字,主要用于UDP
 */
int main(int argc, char **argv) {
    //创建服务器信息结构体
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET; //设置为IPV4
    server_addr.sin_port = htons(SERVER_PORT); //服务器端口号,转换为网络字节流 大端
    inet_pton(AF_INET, server_ip_addr, &(server_addr.sin_addr.s_addr)); //设置服务器ip地址

    //创建UDP套接字
    int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (socket_fd < 0) {
        perror("socket_fd create failed");
        exit(1);
    }

    while (1) {
        char send_buf[128] = ""; //定义缓冲区
        read(STDIN_FILENO, send_buf, sizeof(send_buf)); //从标准输入读取待发送信息到缓冲区
        send_buf[strlen(send_buf) - 1] = 0; //此处使用来处理输入的换行符
        sendto(socket_fd, send_buf, strlen(send_buf), 0,
                (struct sockaddr*) (&server_addr), sizeof(struct sockaddr_in));
        char receive_buf[128] = "";
        recvfrom(socket_fd, receive_buf, sizeof(receive_buf), 0, NULL, NULL); //从缓冲区读入信息到read_buf
        printf("%s\n", receive_buf);

    }
    close(socket_fd);
    return 0;
}

相关推荐