UDP protocol two-way communication

//Server
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <stdlib.h>

#define DEST_IP "192.168.1.224" // ubuntu
#define DEST_PORT 60000
#define DEST_IP1 "192.168.1.224" // ubuntu
#define DEST_PORT1 60001

struct coll_package
{
    struct sockaddr_in client_addr; //Storage client's address and port
    struct sockaddr_in dest_addr;
    socklen_t address_len;
    int socket_fd;


};
/*
    Receiving end
*/
void * udp_rev(void *arg)
{
    struct coll_package cl = *(struct coll_package *)arg;
    char buf[1024] = {0};
    int ret;
    char *ip;
    int port;
    while(1)
    {
        memset(buf,0,sizeof(buf));
        ret = recvfrom(cl.socket_fd,buf,sizeof(buf),0,(struct sockaddr *) & amp;(cl.client_addr), & amp;cl.address_len);
        if(ret < 0)
        {
            perror("recvfrom fail");
            return NULL;
        }
        if(strcmp(buf,"byebye")==0)
        {
            exit(0);
        }
        ip = inet_ntoa((cl.client_addr).sin_addr);
        port = ntohs((cl.client_addr).sin_port);
        printf("[%d][%s]recvfrom ok buf:%s ret:%d\\
",port,ip,buf,ret);
       
    }

    
}
int main(int argc,char **argv)
{
    int ret = 0;
    pthread_t pid;
    struct coll_package cl;
    // Create socket
    int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (socket_fd < 0)
    {
        perror("socket fail");
        return -1;
    }

    //So setting the port number can be reused, these two statements are placed before binding bind
    int optval = 1;
    setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, & amp;optval, sizeof(optval));
    
    // Bind the local IP and port (used to receive data)
    struct sockaddr_in dest_addr;
    dest_addr.sin_family = AF_INET; // ipv4
    dest_addr.sin_port = htons(DEST_PORT); // Convert local port to network port
    dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); // Convert local IP to network IP
    ret = bind(socket_fd, (struct sockaddr *) & amp;dest_addr, sizeof(dest_addr));
    if (ret < 0)
    {
        perror("bind fail");
        return -1;
    }
    printf("Successfully bound to local machine [%d][%s]\\
", DEST_PORT, DEST_IP);

    // Receive data
   
    cl.client_addr.sin_family = AF_INET; // ipv4
    cl.client_addr.sin_port = htons(DEST_PORT1); // Convert local port to network port
    cl.client_addr.sin_addr.s_addr = inet_addr(DEST_IP1); // Convert local IP to network IP

    socklen_t address_len = sizeof(cl.client_addr);
    char buf[1024] = {0};
    cl.socket_fd = socket_fd;
    cl.dest_addr = dest_addr;
    cl.address_len = address_len;
    char *ip;
    int port;
    pthread_create( & amp;pid,NULL,udp_rev,(void*) & amp;cl);
    while (1)
    {
        printf("Send information to server\\
");
        scanf("%s",buf);
        ret=sendto(socket_fd,buf, strlen(buf), 0, (struct sockaddr *) & amp;cl.client_addr, sizeof(dest_addr));
        ip = inet_ntoa((cl.client_addr).sin_addr);
        port = ntohs((cl.client_addr).sin_port);
       if(strcmp(buf,"byebye")==0)
        {
            exit(0);
        }
        sleep(1);
    }

    //Close socket
    close(socket_fd);

    return 0;
}


//

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


#define DEST_IP "192.168.1.224" // ubuntu
#define DEST_PORT 60001
#define DEST_IP1 "192.168.1.224" // ubuntu
#define DEST_PORT1 60000

struct coll_package
{
    struct sockaddr_in client_addr; //Storage client's address and port
    struct sockaddr_in dest_addr;
    socklen_t address_len;
    int socket_fd;


};
/*
    Receiving end
*/
void * udp_rev(void *arg)
{
    struct coll_package cl = *(struct coll_package *)arg;
    char buf[1024] = {0};
    int ret;
    char *ip;
    int port;
    while(1)
    {
        memset(buf,0,sizeof(buf));
        ret = recvfrom(cl.socket_fd,buf,sizeof(buf),0,(struct sockaddr *) & amp;(cl.client_addr), & amp;cl.address_len);
        if(ret < 0)
        {
            perror("recvfrom fail");
            return NULL;
        }
        if(strcmp(buf,"byebye")==0)
        {
            exit(0);
        }
        ip = inet_ntoa((cl.client_addr).sin_addr);
        port = ntohs((cl.client_addr).sin_port);
        printf("[%d][%s]recvfrom ok buf:%s ret:%d\\
",port,ip,buf,ret);
       
    }

    
}
int main(int argc,char **argv)
{
    int ret = 0;
    pthread_t pid;
    struct coll_package cl;
    // Create socket
    int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (socket_fd < 0)
    {
        perror("socket fail");
        return -1;
    }

    //So setting the port number can be reused, these two statements are placed before binding bind
    int optval = 1;
    setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, & amp;optval, sizeof(optval));
    
    // Bind the local IP and port (used to receive data)
    struct sockaddr_in dest_addr;
    dest_addr.sin_family = AF_INET; // ipv4
    dest_addr.sin_port = htons(DEST_PORT); // Convert local port to network port
    dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); // Convert local IP to network IP
    ret = bind(socket_fd, (struct sockaddr *) & amp;dest_addr, sizeof(dest_addr));
    if (ret < 0)
    {
        perror("bind fail");
        return -1;
    }
    printf("Successfully bound to local machine [%d][%s]\\
", DEST_PORT, DEST_IP);
    cl.client_addr.sin_family = AF_INET; // ipv4
    cl.client_addr.sin_port = htons(DEST_PORT1); // Convert local port to network port
    cl.client_addr.sin_addr.s_addr = inet_addr(DEST_IP1); // Convert local IP to network IP

    socklen_t address_len = sizeof(cl.client_addr);
    char buf[1024] = {0};
    cl.socket_fd = socket_fd;
    cl.dest_addr = dest_addr;
    cl.address_len = address_len;
    char *ip;
    int port;
    pthread_create( & amp;pid,NULL,udp_rev,(void*) & amp;cl);
    while (1)
    {
        printf("Send information to client\\
");
        scanf("%s",buf);
        ret=sendto(socket_fd,buf, strlen(buf), 0, (struct sockaddr *) & amp;cl.client_addr, sizeof(dest_addr));
        ip = inet_ntoa((cl.client_addr).sin_addr);
        port = ntohs((cl.client_addr).sin_port);
        if(strcmp(buf,"byebye")==0)
        {
            exit(0);
        }
        sleep(1);
    }

    //Close socket
    close(socket_fd);

    return 0;
}