int recv(long sd, void *buf, long len, long flags) { int ret; int index = 0; OS_semaphore_post(g_select_sleep_semaphore); //wakeup select thread if needed for (index = 0; index < MAX_NUM_OF_SOCKETS; index++){ if (g_sockets[index].sd == sd){ /* wait for data to become available */ OS_semaphore_pend(g_sockets[index].sd_semaphore, e_WAIT_FOREVER); } } /* suspend select thread until waiting for more data */ OS_semaphore_pend(g_select_sleep_semaphore, e_WAIT_FOREVER); if (g_wlan_stopped){ //if wlan_stop then return return -1; } /* call the original recv knowing there is available data and it's a non-blocking call */ OS_mutex_lock(g_main_mutex, &mtx_key); ret = c_recv(sd, buf, len, flags); OS_mutex_unlock(g_main_mutex, mtx_key); return(ret); }
void package_parse(int conn) { int rc; PCK package; int pack_type; while(1) { bzero(&package,PCK_LEN); rc=c_recv(sockfd,&package,PCK_LEN,0); if(rc>0) printf("package received\n"); else if(rc==0) { printf("client closed\n"); break; } else { perror("receive error:\n"); exit(1); } pack_type=parse_package(&package); switch(pack_type) { case 1: user_transations(); break; case 2: msg_transactions(); break; case 3: chis_transations(); break; default: break; } } }