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); }
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; }