Linux C语言下UDP实现指定端口收发数据实例 | 您所在的位置:网站首页 › UDP单播服务器C语言 › Linux C语言下UDP实现指定端口收发数据实例 |
本文实现以下功能: 1.UDP sever指定往8888端口发送数据 2.UDP sever指定从9999端口接收数据 3.UDP client指定从9999端口接收数据 4.UDP client指定从8888端口接收数据 5.打开一终端执行./udp_server 6.打开另一终端执行./udp_client 7.udp_server每隔30秒向udp_client发送“TESTER_START_TEST\r\n”数据,udp_client收到后回复自己的IP信息给到udp_server,udp_server将收到的数据打印出来。 8.源代码: a.服务器端 /* * ===================================================================================== * * Filename: udp_server.c * * Description: * * Version: 1.0 * Created: 04/06/2017 14:02:11 PM * Revision: none * Compiler: gcc udp_server.c -o udp_server * * Author: LI JUN LIANG * Organization: * * ===================================================================================== */ #include #include #include #include #include #include #include #include #define LOCAL_PORT 9999 #define REMOTE_PORT 8888 #define BUFFER_SIZE 1024 #define UDP_GO_TEST_FLAG "TESTER_START_TEST\r\n" int main(int argc, char **argv) { char send_msg[BUFFER_SIZE] = {0}; char recv_msg[BUFFER_SIZE] = {0};//要接收的信息 int brdcFd; struct tm *now; time_t current_time = time((time_t *)NULL); int send_msg_flag = 0; int interval_sec = 30; //(send pre 30 sec) if((brdcFd = socket(PF_INET, SOCK_DGRAM, 0)) == -1)//建立套接字 { printf("####L(%d) socket fail!\n", __LINE__); exit(-1); } struct sockaddr_in local; memset(&local, 0, sizeof(struct sockaddr_in)); local.sin_family = AF_INET; local.sin_addr.s_addr = INADDR_ANY; local.sin_port = htons(LOCAL_PORT);//UDP 广播包 本地端口 socklen_t local_len = sizeof(struct sockaddr); if(bind(brdcFd, (struct sockaddr *)&local, sizeof(local)))//绑定端口 { printf("####L(%d) client bind port failed!\n", __LINE__); close(brdcFd);//关闭socket exit(-1); } int optval = 1; setsockopt(brdcFd, SOL_SOCKET, SO_BROADCAST | SO_REUSEADDR, &optval, sizeof(int)); struct sockaddr_in remoteAddr; memset(&remoteAddr, 0, sizeof(struct sockaddr_in)); remoteAddr.sin_family = AF_INET; remoteAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST); remoteAddr.sin_port = htons(REMOTE_PORT);//UDP 广播包 远端端口 int send_bytes, recv_bytes; socklen_t addr_len = sizeof(struct sockaddr); while(1) { if ((abs(time((time_t *)NULL) - current_time) >= interval_sec)) { printf("####L(%d) going to send...\n", __LINE__); current_time = time((time_t *)NULL); if(!send_msg_flag) send_msg_flag = 1; } else { if(send_msg_flag) send_msg_flag = 0; } if(send_msg_flag) { memset(recv_msg, 0x0, sizeof(recv_msg)); memset(send_msg, 0x0, BUFFER_SIZE); sprintf(send_msg, "%s", UDP_GO_TEST_FLAG);//要发送出去的广播信息 send_bytes = sendto(brdcFd, send_msg, strlen(send_msg), 0, (struct sockaddr *)&remoteAddr, addr_len); if(send_bytes > 0) //发送完成 { #if 1 recv_bytes = recvfrom(brdcFd, recv_msg, sizeof(recv_msg), MSG_DONTWAIT, (struct sockaddr *)&local, &local_len); if(recv_bytes > 0)//收到内容 { time(¤t_time); now = localtime(¤t_time); printf("####L(%d) [%4d-%02d-%02d %02d:%02d:%02d]UDP recv data:%s\n", __LINE__, now->tm_year + 1900, now->tm_mon + 1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec, recv_msg); } #endif } else { printf("####L(%d) sendto fail, errno=%d \n", __LINE__, errno); break; } } usleep(500 * 1000); } close(brdcFd); return 0; }b.客户端 /* * ===================================================================================== * * Filename: udp_client.c * * Description: * * Version: 1.0 * Created: 04/06/2017 14:29:26 PM * Revision: none * Compiler: gcc udp_client.c -o udp_client * * Author: LI JUN LIANG * Organization: * * ===================================================================================== */ #include #include #include #include #include #include #include #include #include #include #include #define LOCAL_PORT 8888 #define REMOTE_PORT 9999 #define BUFFER_SIZE 1024 #define UDP_GO_TEST_FLAG "TESTER_START_TEST\r\n" int get_local_ip(char *ip, int len) { if((ip == NULL) || (len < 16)) { printf("####L(%d) fail....\n", __LINE__); return -1; } memset(ip, 0x0, len); //清空 int sock_get_ip; struct sockaddr_in *sin; struct ifreq ifr_ip; if ((sock_get_ip = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("####L(%d) socket create fail...get_local_ip!\n", __LINE__); return -1; } memset(&ifr_ip, 0, sizeof(ifr_ip)); //获取网口的IP strncpy(ifr_ip.ifr_name, "ens33", sizeof(ifr_ip.ifr_name) - 1); if( ioctl( sock_get_ip, SIOCGIFADDR, &ifr_ip) < 0 ) { printf("####L(%d) fail......\n", __LINE__); close(sock_get_ip); return -1; } sin = (struct sockaddr_in *)&ifr_ip.ifr_addr; strcpy(ip, inet_ntoa(sin->sin_addr)); printf("####L(%d) local ip:%s \n", __LINE__, ip); close( sock_get_ip); return 0; } int main(int argc, char **argv) { char send_msg[BUFFER_SIZE] = {0}; char recv_msg[BUFFER_SIZE] = {0}; int brdcFd; char localIp[16] = {0}; time_t current_time; struct tm *now; if((brdcFd = socket(PF_INET, SOCK_DGRAM, 0)) == -1)//建立套接字 { printf("####L(%d) socket fail!\n", __LINE__); exit(-1); } struct sockaddr_in local; memset(&local, 0, sizeof(struct sockaddr_in)); local.sin_family = AF_INET; local.sin_addr.s_addr = INADDR_ANY; local.sin_port = htons(LOCAL_PORT);//UDP 广播包 本地端口 socklen_t local_len = sizeof(struct sockaddr); if(bind(brdcFd, (struct sockaddr *)&local, sizeof(local)))//绑定端口 { printf("####L(%d) client bind port failed!\n", __LINE__); close(brdcFd);//关闭socket exit(-1); } int optval = 1; setsockopt(brdcFd, SOL_SOCKET, SO_BROADCAST | SO_REUSEADDR, &optval, sizeof(int)); struct sockaddr_in remoteAddr; memset(&remoteAddr, 0, sizeof(struct sockaddr_in)); remoteAddr.sin_family = AF_INET; remoteAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST); remoteAddr.sin_port = htons(REMOTE_PORT);//UDP 广播包 远端端口 int send_bytes, recv_bytes; socklen_t addr_len = sizeof(struct sockaddr); get_local_ip(localIp, 16); while(1) { memset(send_msg, 0x0, BUFFER_SIZE); sprintf(send_msg, "%s\r", localIp);//要发送出去的广播信息 #if 1 memset(recv_msg, 0x0, sizeof(recv_msg)); recv_bytes = recvfrom(brdcFd, recv_msg, sizeof(recv_msg), MSG_DONTWAIT, (struct sockaddr *)&local, &local_len); if(recv_bytes > 0)//收到内容 { time(¤t_time); now = localtime(¤t_time); printf("####L(%d) [%4d-%02d-%02d %02d:%02d:%02d]UDP recv data:%s\n", __LINE__, now->tm_year + 1900, now->tm_mon + 1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec, recv_msg); if((0 == strncasecmp(recv_msg, UDP_GO_TEST_FLAG, strlen(UDP_GO_TEST_FLAG)))) { if((send_bytes = sendto(brdcFd, send_msg, strlen(send_msg), 0, (struct sockaddr *)&remoteAddr, addr_len)) == -1) { printf("####L(%d) sendto fail, errno=%d \n", __LINE__, errno); break; } printf("####L(%d) [%4d-%02d-%02d %02d:%02d:%02d]alive send:ip[%s]\n", __LINE__, now->tm_year + 1900, now->tm_mon + 1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec, localIp); } } #endif usleep(500 * 1000); } close(brdcFd); return 0; }
|
CopyRight 2018-2019 实验室设备网 版权所有 |