/*
UDP IPV6 Echo Server
Author :Andrew Huang
*/
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <netdb.h>
#include <string.h>
#include <signal.h>
static int listen_fd = -1;
void exit_handler(int no)
{
close(listen_fd);
exit(0);
}
int main(int argc,char * argv[])
{
unsigned short port = 9000;
char addr_buf[1024];
char buf[1024];
int len;
signal(SIGTERM,exit_handler);
signal(SIGINT,exit_handler);
/* ipv 6 地址 */
struct sockaddr_in6 server_addr;
struct sockaddr_in6 client_addr;
socklen_t sockaddr_len = sizeof(struct sockaddr_in6);
if(argc > 1)
port = (unsigned short)atoi(argv[1]);
/* 第一步:创建UDP SOCKET*/
listen_fd = socket(PF_INET6,SOCK_DGRAM,0);
if(listen_fd == -1)
{
perror("socket");
}
/* 第二步:设置侦听端口 */
memset((void *)&server_addr,0,sizeof(server_addr));
server_addr.sin6_family = AF_INET6 ; /* ipv6 */
server_addr.sin6_port = htons(port);
server_addr.sin6_addr = in6addr_any;
if(bind(listen_fd,(struct sockaddr *)&server_addr,sockaddr_len)!=0)
{
perror("bind");
exit_handler(0);
}
fprintf(stdout,"UDP ipv6 echo server ,listen on %d,fd%d\n",port,listen_fd);
/* 第四步:开始用等待客户端的联接 */
while(1)
{
memset((void *)&client_addr,0,sizeof(client_addr));
sockaddr_len = sizeof(struct sockaddr_in6);
len = recvfrom(listen_fd,buf,sizeof(buf),0,(struct sockaddr * )&client_addr,&sockaddr_len);
fprintf(stdout,"client connect: ip %s,port %d,len=%d\n",inet_ntop(AF_INET6, (void *)&(client_addr.sin6_addr),addr_buf, sockaddr_len),ntohs(client_addr.sin6_port),len);
fprintf(stdout,"client buffer=%s\n",buf);
if(len <=0)
continue;
if(strncmp("exit",buf,4)==0)
break;
sendto(listen_fd,buf,len,0,(struct sockaddr * )&client_addr,sockaddr_len);
}
fprintf(stdout,"close UDP server\n");
exit_handler(0);
}
|