1. 程式人生 > >Linux系統實現udp模式下兩個客戶端間的通訊

Linux系統實現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