1. 程式人生 > 實用技巧 >Linux下udp程式設計

Linux下udp程式設計

server.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<unistd.h>
#include<arpa/inet.h>
#include <sys/time.h>    
#include 
<unistd.h> #define UDP_PORT 8080 #define UDP_BUF_SIZE 100 #define UDP_SERV_IP_ADDR "192.168.100.178" #define UDP_CLIENT_IP_ADDR "192.168.100.51" int main(void) { int fd = -1; int len = 0; int res = 0; int i; struct sockaddr_in sin; /* 建立socket_fd */ if((fd = socket( AF_INET, SOCK_DGRAM , 0
)) < 0) { printf("*******SOCKET********\n"); return -1; } /* 允許繫結地址快速重用 */ int b_reuse = 1; setsockopt( fd, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof(b_reuse)); /* 填充struct sockaddr_in 結構體變數 */ bzero( &sin, sizeof(sin)); sin.sin_family
= AF_INET; sin.sin_port = htons(UDP_PORT); /* 讓伺服器程式能繫結在任意的IP上 */ #if 1 sin.sin_addr.s_addr = htonl(INADDR_ANY); #else if((inet_pton(AF_INET, UDP_SERV_IP_ADDR, (void *)&sin.sin_addr)) < 0) { printf("******INET_PTON*******\n"); return -1; } #endif /* 繫結 */ if(bind (fd, (struct sockaddr *)&sin, sizeof(sin)) <0 ) { printf("*******bind*******\n"); return -1; } char buf[UDP_BUF_SIZE]; struct sockaddr_in cin; socklen_t addrlen = sizeof(cin); while(1) { bzero(buf ,UDP_BUF_SIZE); len = recvfrom(fd, buf, UDP_BUF_SIZE-1,0,(struct sockaddr*)&cin, &addrlen); if(len > 0) { char ipv4_addr[16]; if(!inet_ntop(AF_INET, (void *)&cin.sin_addr, ipv4_addr, sizeof(cin))) { printf("*******inet_ntop********\n"); return -1; } printf("********recv from (%s:%d), date:",ipv4_addr, ntohs(sin.sin_port)); for(i = 0;i< len;i++) printf("%02X ", buf[i]); printf("\n"); } } close(fd); return 0; }