//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; }