C语言实现Linux下的UDP服务端和客户端

程序实现了UDP服务端和客户端,客户端发送消息后等待服务端响应。

udp_server.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>

#define LISTEN_PORT 12345
#define BUFFER_SIZE 1024

int main() {
    int sockfd;
    struct sockaddr_in listen_addr, client_addr;
    socklen_t addr_len;
    char buffer[BUFFER_SIZE];
    char message[BUFFER_SIZE];

    // 创建套接字
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        perror("socket");
        exit(1);
    }

    // 设置监听地址信息
    memset(&listen_addr, 0, sizeof(listen_addr));
    listen_addr.sin_family = AF_INET;
    listen_addr.sin_port = htons(LISTEN_PORT);
    listen_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    // 绑定套接字到监听地址
    if (bind(sockfd, (struct sockaddr *)&listen_addr, sizeof(listen_addr)) < 0) {
        perror("bind");
        exit(1);
    }

    printf("waiting...\n");

    while (1) {
        // 接收消息
        addr_len = sizeof(client_addr);
        if (recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &addr_len) < 0) {
            perror("recvfrom");
            exit(1);
        }

        printf("receive: %s", buffer);

        // 检查是否退出
        if (strcmp(buffer, "exit\n") == 0) {
            printf("Bye\n");
            break;
        }

        // 读取服务器端的回复消息
        printf("input reply: ");
        fgets(message, BUFFER_SIZE, stdin);

        // 发送回复消息给客户端
        if (sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&client_addr, addr_len) < 0) {
            perror("sendto");
            exit(1);
        }
    }

    // 关闭套接字
    close(sockfd);

    return 0;
}

udp_client.c:

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

#define DEST_IP "127.0.0.1"
#define DEST_PORT 12345
#define BUFFER_SIZE 1024

int main() {
    int sockfd;
    struct sockaddr_in dest_addr;
    char buffer[BUFFER_SIZE];
    char message[BUFFER_SIZE];

    // 创建套接字
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        perror("socket");
        exit(1);
    }

    // 设置目的地址信息
    memset(&dest_addr, 0, sizeof(dest_addr));
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(DEST_PORT);
    dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);

    while (1) {
        // 读取用户输入
        printf("input: ");
        fgets(message, BUFFER_SIZE, stdin);

        // 发送消息
        if (sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) < 0) {
            perror("sendto");
            exit(1);
        }

        // 检查是否退出
        if (strcmp(message, "exit\n") == 0) {
            printf("Bye\n");
            break;
        }

        // 接收回复消息
        if (recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL) < 0) {
            perror("recvfrom");
            exit(1);
        }

        printf("receive: %s", buffer);
    }

    // 关闭套接字
    close(sockfd);

    return 0;
}

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要使用UDP实现全双工聊天,你需要创建两个程序:一个用于发送消息,另一个用于接收消息。以下是一个简单的示例程序: 1.发送消息程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 8888 #define BUF_SIZE 1024 int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in server_addr; char buf[BUF_SIZE]; if (argc != 2) { printf("Usage: %s <IP Address>\n", argv[0]); exit(1); } sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); exit(1); } memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = inet_addr(argv[1]); while (1) { printf("Please enter message: "); fgets(buf, BUF_SIZE, stdin); sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr)); } close(sockfd); return 0; } ``` 2.接收消息程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 8888 #define BUF_SIZE 1024 int main() { int sockfd; struct sockaddr_in server_addr, client_addr; socklen_t addr_len; char buf[BUF_SIZE]; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); exit(1); } memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("bind"); exit(1); } while (1) { addr_len = sizeof(client_addr); memset(buf, 0, BUF_SIZE); recvfrom(sockfd, buf, BUF_SIZE, 0, (struct sockaddr *)&client_addr, &addr_len); printf("Received message from %s:%d: %s", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buf); } close(sockfd); return 0; } ``` 在其中一个终端中运行接收消息程序,另一个终端中运行发送消息程序。这样就可以实现基本的全双工聊天了。 ### 回答2: C语言使用UDP协议实现全双工聊天可以通过以下步骤完成: 1. 创建两个套接字,一个用于发送消息,一个用于接收消息。其中一个套接字作为客户端,另一个作为服务器。 2. 客户端首先获取目标主机的IP地址和端口号,然后将其作为另一方的套接字地址。 3. 客户端通过发送消息套接字,将用户输入的消息发送给服务器。 4. 服务器接收到消息后,将其打印出来,并通过发送消息套接字将响应消息发送给客户端。 5. 客户端接收服务器的响应消息,并将其打印出来。 6. 重复以上步骤,实现全双工聊天。客户端和服务器都可以同时发送和接收消息。 需要注意的是,UDP是一种无连接协议,因此在发送消息之前,需要确保发送方和接收方已经建立好通信连接。为了实现全双工聊天,可以使用多线程的方式,分别处理发送消息和接收消息的功能。 在发送消息时,需要使用sendto()函数将消息发送给目标地址。接收消息时,可以使用recvfrom()函数从套接字中获取消息。 综上所述,通过实现以上步骤,我们可以使用C语言UDP协议实现全双工聊天。这种方式可以实现用户之间的实时交流,适用于一对一或者一对多的聊天场景。 ### 回答3: 全双工聊天是指两个用户之间可以同时发送和接收消息。C语言可以使用UDP协议来实现全双工聊天。 在UDP通信中,每个用户都可以作为服务器和客户端同时存在。用户A和用户B可以同时发送和接收消息。 首先,用户A和用户B都需要创建一个套接字(socket)。套接字用于连接用户与网络。接下来,用户A将套接字绑定到一个指定的IP地址和端口上,并等待接收用户B的消息。 用户B同样需要创建一个套接字,并将其绑定到一个指定的IP地址和端口上。然后,用户B可以使用套接字向用户A发送消息。 用户A和用户B都可以通过套接字来发送和接收消息。发送消息的函数可以使用sendto()函数来发送消息到指定的IP地址和端口。接收消息的函数可以使用recvfrom()函数来接收消息。 通过以上步骤,用户A和用户B可以在UDP协议下实现全双工聊天。他们可以同时发送和接收消息,实现实时的双向沟通。 需要注意的是,UDP协议是一种不可靠的协议,数据包可能会丢失或乱序。为了保证可靠性,可以在发送方和接收方添加一些数据校验或重传机制。 对于使用C语言实现全双工聊天,可以使用sockaddr_in结构体来存储IP地址和端口号。使用socket()函数创建套接字,并使用bind()函数将套接字绑定到指定的IP地址和端口上。然后,可以使用sendto()函数发送消息,recvfrom()函数接收消息。 通过以上步骤,就可以使用C语言使用UDP实现全双工聊天。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2193410903

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值