예제 #1
0
파일: udpprog.c 프로젝트: fU9ANg/eAudit
void udp_anwser(void)
{
  struct sockaddr_in c_addr;
  char buff[128],buf[80],buf_eA[80],userid[10],msg_record[80];
  unsigned char bufx[256],tmp[128];

  PSESSION_HDR_ID ps;
  PSESSION_HDSK *rsp;
  unsigned long * pl;
 
  int len,i,j,length,offset,i_recv,logout,ti;
  unsigned long ret,parity,crcnum1,crcnum2,tail_crc;
  unsigned long *lp;

  ps=malloc(sizeof(PSESSION_HDR));
  rsp=malloc(sizeof(PSESSION_HDSK));

  while (1) { 
	sem_wait(&sem);
	//printf("pthread udp_anwser ----size=%d\n",size);
	for (i=0;i<num_pthread;i++)
	  if (queue[i].flag==1) {
		c_addr=queue[i].addr;
		len=queue[i].length;
		memcpy(buff,queue[i].message,128);

		//printf("收到来自%s:%d的消息:%s        byte %d    flag=%d\n\r",
		//   inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port), buff,len,queue[i].flag);

		ps=(PSESSION_HDR_ID)buff;

		ps->version=ntohs(ps->version);
		ps->serial=ntohl(ps->serial);
		ps->param_length=ntohl(ps->param_length);
		ps->prt_crc=ntohl(ps->prt_crc);

		bzero(bufx, 50);
		memcpy(bufx,ps,sizeof(PSESSION_HDR)-4);

		crcnum1=crc32(0,bufx,sizeof(PSESSION_HDR)-4);

		//printf("crcnum1=%x,  prt_crc=%x\n",crcnum1,ps->prt_crc);

		bzero(bufx, 256);
		memcpy(bufx,ps,sizeof(PSESSION_HDR));
		memcpy((bufx+28),(buff+28),ps->param_length);

		crcnum2=crc32(0,bufx,28+ps->param_length);

		bzero(bufx,4);
		memcpy(bufx,(buff+len-4),4);
		pl=(unsigned long *)bufx;
		tail_crc=*pl;

		//printf("crcnum2=%x,  tail_crc=%x\n",crcnum2,tail_crc);

		if ( (crcnum1==ps->prt_crc)  && (crcnum2==tail_crc) )
		{
		  if ( !strncmp((char *)(ps->flag),"SNRP",4) && (ps->opt_code==0x03) ) 
		  {
			DEBUG("recev a correct handshake message of SAIL\n");

			offset=sizeof(PSESSION_HDR);

			length=buff[offset];
			offset+=1;

			memcpy(userid,(buff+offset),length);
			userid[length]='\0';

			clear_count(atoi(userid));

			ps->opt_code=0x83;
			ps->param_length=sizeof(PSESSION_HDSK);

			memset(buf,0,80);
			memcpy(buf,ps,sizeof(PSESSION_HDR)-4);
			ps->prt_crc=crc32(0,(unsigned char *)buf,sizeof(PSESSION_HDR)-4);

			memset(buf,0,80);
			memcpy(buf,ps,sizeof(PSESSION_HDR));

			rsp->result = htonl(0);
			rsp->ip     = htonl(s_addr.sin_addr.s_addr);
			rsp->port   = htons(s_addr.sin_port);

			memcpy(buf+28,rsp,sizeof(PSESSION_HDSK));
			parity=crc32(0,(unsigned char *)buf,28+sizeof(PSESSION_HDSK));

			ps->version      = htons(ps->version);
			ps->serial       = htonl(ps->serial);
			ps->param_length = htonl(ps->param_length);
			ps->prt_crc      = htonl(ps->prt_crc);
			memcpy(buf,ps,sizeof(PSESSION_HDR));

			memcpy(buf+28+sizeof(PSESSION_HDSK),&parity,4);

			len=sizeof(PSESSION_HDR)+sizeof(PSESSION_HDSK)+4; 
			sendto(sock, buf, len, 0, (struct sockaddr *) &c_addr, sizeof(c_addr));

			DEBUG("server send handshake ok!\n");
		  }

		  if (!strncmp((char *)(ps->flag),"SNRP",4) && (ps->opt_code==0x02) ) 
		  {
			DEBUG("recev a correct  logout  message of SAIL\n");

			for (j=0;j<num_eAudit;j++)
			{  
			  DEBUG("is2h1=%d\n",is2h1);

			  if ( !is2h1 && !strncmp(p_map[j].addr,degree_ip,16)) continue;

			  DEBUG("[udp]%d----%s----logout_flag=%d\n",j,p_map[j].addr,p_map[j].logout_flag);
			  if ( 0 == p_map[j].logout_flag )                        
				do  
				{
				  offset=28;
				  length=buff[offset];
				  offset+=1;
				  memcpy(userid,(buff+offset),length);
				  userid[length]='\0';

				  logout=0;
				  memcpy(pst->flag,"SRTA",4);
				  pst->version=0x0100;
				  pst->opt_code=0x02;
				  pst->param_length = ps->param_length;

				  //printf("param_length=================%d\n",ps->param_length);

				  memset(buf_eA,0,80);
				  memcpy(buf_eA,pst,sizeof(PSRTA_HDR));
				  memcpy(buf_eA+sizeof(PSRTA_HDR),buff+28,ps->param_length);

				  memcpy(bufx,buff+28,ps->param_length);

				  parity=crc32(0,(unsigned char *)buf_eA,sizeof(PSRTA_HDR)+ps->param_length);

				  //printf("parity==%d          len----%d\n",parity,sizeof(PSRTA_HDR)+ps->param_length);

				  memcpy(buf_eA+sizeof(PSRTA_HDR)+ps->param_length,&parity,4);
				  len=sizeof(PSRTA_HDR)+ps->param_length+4; 

				  //sendto(Audp_sock, buf_eA, len, 0, (struct sockaddr *) &eA_addr, sizeof(eA_addr));
				  sendto(p_map[j].udp_sock, buf_eA, len, 0, (struct sockaddr *) &(p_map[j].s_addr), sizeof(p_map[j].s_addr));

				  length=sizeof(p_map[j].s_addr);  //eA_addr);

				  DEBUG("[udp]%d----%s----logout_flag=%d\n",j,p_map[j].addr,p_map[j].logout_flag);
				  if ( 1 == p_map[j].logout_flag ) break;

				  //i_recv=recvfrom(Audp_sock, tmp, 128, 0, (struct sockaddr *)&eA_addr, (socklen_t *)&length);
				  i_recv=recvfrom(p_map[j].udp_sock, tmp, 128, 0, (struct sockaddr *)&(p_map[j].s_addr), (socklen_t *)&length);

				  if (i_recv>4)
				  {
					//printf("i_recv ------------ %d\n",i_recv);
					bzero(bufx, 128);
					memcpy(bufx,tmp,i_recv-4);

					parity=crc32(0,bufx,i_recv-4);

					bzero(bufx,20);
					memcpy(bufx,(tmp+i_recv-4),4);
					lp=(unsigned long *)&bufx;
					tail_crc=*lp;

					//printf("parity: %u      tail_crc: %u\n",parity,tail_crc);  
					if ( parity==tail_crc)
					{
					  bzero(bufx,50);
					  memcpy(bufx,(tmp+sizeof(PSRTA_HDR)),4);
					  lp=(unsigned long *)&bufx;
					  parity=*lp;
					  //printf("return : %u\n",parity);
					  if (parity==0)
					  {  
						len=tmp[sizeof(PSRTA_HDR)+4];
						bzero(bufx,50);
						memcpy(bufx,tmp+sizeof(PSRTA_HDR)+4+1,len);
						bufx[len]='\0';
						if (atoi((char *)bufx)==atoi(userid))
						{
						  logout=1;
						  ti=atoi(userid);
						  sprintf(msg_record,"用户名= %s  ID = %d 注销成功!",
							  rgst_queue[ti].user_name,rgst_queue[ti].user_id);
						  write_log_info(msg_record);
						  DEBUG("communicat to eAudit logout------ok!");
						} 
					  }
					}
				  }
				} while (logout==0);
			}

			offset=28;


			length=buff[offset];
			offset+=1;

			memcpy(userid,(buff+offset),length);
			userid[length]='\0';

			//sprintf(msg_record,"用户ID %s 注销成功!",userid); 
			//write_log_info(msg_record);

			clear_flag(atoi(userid));

			ps->opt_code=0x82;
			ps->param_length=4;

			memset(buf,0,80);
			memcpy(buf,ps,sizeof(PSESSION_HDR)-4);
			ps->prt_crc=crc32(0,(unsigned char *)buf,sizeof(PSESSION_HDR)-4);

			memset(buf,0,80);
			memcpy(buf,ps,sizeof(PSESSION_HDR));

			ret= htonl(0);

			memcpy(buf+28,&ret,4);
			parity=crc32(0,(unsigned char *)buf,28+4);

			ps->version      = htons(ps->version);
			ps->serial       = htonl(ps->serial);
			ps->param_length = htonl(ps->param_length);
			ps->prt_crc      = htonl(ps->prt_crc);
			memcpy(buf,ps,sizeof(PSESSION_HDR));

			memcpy(buf+28+4,&parity,4);

			len=sizeof(PSESSION_HDR)+4+4; 
			sendto(sock, buf, len, 0, (struct sockaddr *) &c_addr, sizeof(c_addr));

		  }

		  queue[i].flag=0;

		  // pthread_mutex_lock(&mutex); //如果mutex已上锁,则阻塞直到锁被释放

		  // --size;

		  // pthread_mutex_unlock(&mutex);     
		}
	  }
  }


  free(rsp);
  free(ps);
}
예제 #2
0
static int check_capacity(int *board, int w, int h, int i) {
    int n = board[i];
    flood_count(board, w, h, i, board[i], &n);
    clear_count(board, w * h);
    return n == 0;
}