/* udp echo server demo */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int sockfd;
void * MonitorHbaseThread(void *pParam)
{
char recvBuf[2048];
memset(recvBuf,0,2048);
char cliIP[INET_ADDRSTRLEN];
size_t recvLen;
struct sockaddr_in cliAddr; // = (struct sockaddr_in )*pParam ;
memcpy(&cliAddr, pParam ,sizeof(cliAddr) );
size_t cliAddrLen = sizeof(cliAddr);
int recv_pack_num=0;
while(1)
{
recv_pack_num++;
recvLen = recvfrom(sockfd, recvBuf, 2048, 0,pParam , &cliAddrLen); //(struct sockaddr*)&cliAddr
sprintf(cliIP,inet_ntoa(cliAddr.sin_addr)); //after convert by inet_ntoa, and then port big edian
unsigned short port=cliAddr.sin_port;
port=htons(port); //htonl for 32 bit htons for 16bits
printf("recv packet index:%d,recv from client ip = %s,port:%d \n", recv_pack_num ,cliIP,port );
//printf("recv data:%s\n",recvBuf);
}
}
int main(int argc, char *argv[])
{
struct sockaddr_in bindAddr;
unsigned short port = 9100;
if(argc > 1)
{
port = atoi(argv[1]);
}
printf("UDP Server Started!\n");
// int socket(int family, int type, int protocol);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0)
{
printf("Invalid socket\n");
exit(1);
}
bzero(&bindAddr, sizeof(bindAddr));
bindAddr.sin_family = AF_INET;
bindAddr.sin_port = htons(port);
bindAddr.sin_addr.s_addr = htonl(INADDR_ANY);
printf("Binding server to port %d\n", port);
if(bind(sockfd, (struct sockaddr*)&bindAddr, sizeof(bindAddr)) != 0)
{
close(sockfd);
printf("binding err!\n");
exit(1);
}
printf("waiting data from other client...\n");
int send_pack_num=0;
while(1)
{
char recvBuf[2048];
memset(recvBuf,0,2048);
char cliIP[INET_ADDRSTRLEN];
size_t recvLen;
struct sockaddr_in cliAddr;
size_t cliAddrLen = sizeof(cliAddr);
recvLen = recvfrom(sockfd, recvBuf, 2048, 0, (struct sockaddr*)&cliAddr, &cliAddrLen);
// inet_ntop(AF_INET, &cliAddr.sin_addr.s_addr, cliIP, INET_ADDRSTRLEN)
sprintf(cliIP,inet_ntoa(cliAddr.sin_addr)); //after convert by inet_ntoa, and then port big edian
unsigned short port=cliAddr.sin_port;
port=htons(port); //htonl for 32 bit htons for 16bits
printf("client ip = %s,port:%d \n", cliIP,port);
printf("recv data:%s\n",recvBuf);
send_pack_num++;
/recv thread//
int result=0;
pthread_t ptmonitor_hbase;
if((result=pthread_create(&ptmonitor_hbase,NULL,MonitorHbaseThread,(struct sockaddr*)&cliAddr ))!=0) //独立写hbase数据库线程
{
perror("pthread MonitorHbaseThread create fail:");
exit(-1);
}else
{
//printf("WriteHbaseThread:Hbase thread create success.....\n");
}
while(1)
{
send_pack_num++;
sendto(sockfd, recvBuf, recvLen, 0, (struct sockaddr*)&cliAddr, cliAddrLen);
printf("send packet index:%d,to client ip = %s,port:%d \n", send_pack_num, cliIP,port);
usleep(5000000);
}
//memcpy(recvBuf,&recv_pack_num,4);
sendto(sockfd, recvBuf, 100, 0, (struct sockaddr*)&cliAddr, cliAddrLen);
//usleep(2000000);
sendto(sockfd, recvBuf, 200, 0, (struct sockaddr*)&cliAddr, cliAddrLen);
//printf("recv_pack_num:%d\n",recv_pack_num);
}
close(sockfd);
return 0;
}
//gcc -o udpecho udpechoserver_new.c -lpthread