udp echo server , one thread send ,one thread recv

/* 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值