Linux下用C语言实现udp模式下两个客户端间的通信

需要用到的知识:Linux C网络编程相关知识以及简单的多线程操作

两个客户端的代码是一样的,只要把端口号换一下,一个客户端中的本机端口MY_PORT相当于另一个客户端的目的端口DEST_PORT

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

#define MY_IP "127.0.0.1"
#define MY_PORT 52100

#define DEST_IP "127.0.0.1"
#define DEST_PORT 52200

typedef struct my_sock_cb
{
    int fd;
    struct sockaddr_in addr_my;
    int addrlen_my;
}my_sock_cb;

typedef struct dest_sock_cb
{
    int fd;
    struct sockaddr_in addr_dest;
    int addrlen_dest;
}dest_sock_cb;

my_sock_cb mysock = {-1};
dest_sock_cb destsock = {-1};

int initsocket()
{
    mysock.fd = socket(AF_INET, SOCK_DGRAM, 0);
    destsock.fd = socket(AF_INET, SOCK_DGRAM, 0);
    if( mysock.fd<0 || destsock.fd<0 )
    {
        perror("create socket error!\n");
        exit(1);
    }

    mysock.addr_my.sin_family = AF_INET;
    mysock.addr_my.sin_addr.s_addr = inet_addr(MY_IP);
    mysock.addr_my.sin_port = htons(MY_PORT);
    mysock.addrlen_my = sizeof(struct sockaddr_in);
  
    destsock.addr_dest.sin_family = AF_INET;
    destsock.addr_dest.sin_addr.s_addr = inet_addr(DEST_IP);
    destsock.addr_dest.sin_port = htons(DEST_PORT);
    destsock.addrlen_dest = sizeof(struct sockaddr_in);

    int ret = bind(mysock.fd, (struct sockaddr*)&mysock.addr_my, mysock.addrlen_my);
    if(ret == -1)
    {
        perror("bind.");
        exit(1);
    }

    return 0;
}

void* recv_msg(void* sock)
{
    my_sock_cb *mysock = (my_sock_cb*)sock;
    
    struct sockaddr_in addr_other;
 
    char recvbuf[256];
    while(1)
    {
        recvfrom(mysock->fd, recvbuf, 256, 0, (struct sockaddr*)&addr_other, &mysock->addrlen_my);
        printf("other:>%s\n", recvbuf);
        if( !strcmp(recvbuf, "exit") )
            break;
    }
 
    close(mysock->fd);
}

void* send_msg(void* sock)
{
    dest_sock_cb *destsock = (dest_sock_cb*)sock;
    char sendbuf[256];
    while(1)
    {
        printf("Input:>");
        scanf("%s",sendbuf);
        sendto(destsock->fd, sendbuf, strlen(sendbuf)+1, 0, 
(struct sockaddr*)&destsock->addr_dest,destsock->addrlen_dest);
        if( !strcmp(sendbuf,"exit") )
            break;
    }
    close(destsock->fd);
}

int main()
{
    initsocket();
    my_sock_cb *sock1 = &mysock;
    dest_sock_cb *sock2 = &destsock; 
    
    void* recv_msg(void*);
    void* send_msg(void*);

    pthread_t t1,t2;
    pthread_create(&t2, NULL, send_msg, (void *)sock2);
    pthread_create(&t1, NULL, recv_msg, (void *)sock1);

    pthread_join(t1,NULL);
    pthread_join(t2,NULL);
    
    return 0;
}

参考自:https://blog.csdn.net/manonghouyiming/article/details/79803403

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,我提供一个简单的UDP通信C语言示例代码,其中包括接收二维数组buffer并打印的代码片段: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define MAX_BUFFER_SIZE 1024 int main(int argc, char *argv[]) { int sock_fd; struct sockaddr_in server_addr, client_addr; char buffer[MAX_BUFFER_SIZE]; // 创建UDP套接字 sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock_fd < 0) { perror("Failed to create socket"); exit(EXIT_FAILURE); } // 设置服务器地址和端口号 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(8080); // 绑定服务器地址和端口号 if (bind(sock_fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) { perror("Failed to bind server address"); exit(EXIT_FAILURE); } printf("Server is listening at %s:%d...\n", inet_ntoa(server_addr.sin_addr), ntohs(server_addr.sin_port)); while (1) { int client_addr_len = sizeof(client_addr); // 接收客户端发送的消息 int recv_len = recvfrom(sock_fd, buffer, MAX_BUFFER_SIZE, 0, (struct sockaddr *) &client_addr, &client_addr_len); if (recv_len < 0) { perror("Failed to receive message"); exit(EXIT_FAILURE); } // 打印接收到的消息 int rows = 3; // 假设是3行4列的二维数组 int cols = 4; int i, j, k = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { printf("%c ", buffer[k++]); // 由于是字符数组,所以要用%c打印单个字符 } printf("\n"); } // 发送响应消息给客户端 char *response = "Message received"; int send_len = sendto(sock_fd, response, strlen(response), 0, (struct sockaddr *) &client_addr, client_addr_len); if (send_len < 0) { perror("Failed to send response"); exit(EXIT_FAILURE); } } close(sock_fd); return 0; } ``` 以上代码中,我们通过`recvfrom`函数接收客户端发送的消息,并用两重循环打印出二维数组的内容。其中,我们假设接收到的消息是一个3行4列的二维字符数组。如果实际情况中接收到的消息不是字符数组,可以根据具体情况进行转换和打印。 希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值