/*--------------------------------------------------------------------------------------------------------------------- Tests the network connection to the drone by fetching the drone version number through the FTP server embedded on the drone. This is how FreeFlight checks if a drone sofware update is required. The FTP connection process is a quick and (very)dirty one. It uses FTP passive mode. ---------------------------------------------------------------------------------------------------------------------*/ int test_drone_connection() { const char * passivdeModeHeader = "\r\n227 PASV ok ("; vp_com_socket_t ftp_client,ftp_client2; char buffer[1024]; static Write ftp_write = NULL; static Read ftp_read = NULL; int bytes_to_send,received_bytes; int i,L,x[6],port; vp_os_memset(buffer,0,sizeof(buffer)); /* Connects to the FTP server */ wifi_config_socket(&ftp_client,VP_COM_CLIENT,FTP_PORT,WIFI_ARDRONE_IP); ftp_client.protocol = VP_COM_TCP; if(VP_FAILED(vp_com_init(wifi_com()))) return -1; if(VP_FAILED(vp_com_open(wifi_com(), &ftp_client, &ftp_read, &ftp_write))) return -2; /* Request version file */ bytes_to_send = _snprintf(buffer,sizeof(buffer),"%s", "USER anonymous\r\nCWD /\r\nPWD\r\nTYPE A\r\nPASV\r\nRETR version.txt\r\n"); ftp_write(&ftp_client, (const int8_t*)buffer,&bytes_to_send); /* Dirty. We should wait for data to arrive with some kind of synchronization or make the socket blocking.*/ Sleep(1000); /* Gets the data port */ received_bytes = sizeof(buffer); ftp_read(&ftp_client,(int8_t*)buffer,&received_bytes); if (received_bytes<1) { vp_com_close(wifi_com(), &ftp_client); return -3; } L=received_bytes-strlen(passivdeModeHeader); /* Searches for the passive mode acknowlegment from the FTP server */ for (i=0;i<L;i++) { if (strncmp((buffer+i),passivdeModeHeader,strlen(passivdeModeHeader))==0) break; } if (i==L) { vp_com_close(wifi_com(), &ftp_client); return -4; } i+=strlen(passivdeModeHeader); if (sscanf(buffer+i,"%i,%i,%i,%i,%i,%i)",&x[0],&x[1],&x[2],&x[3],&x[4],&x[5])!=6) { vp_com_close(wifi_com(), &ftp_client); return -5; } port=(x[4]<<8)+x[5]; /* Connects to the FTP server data port */ wifi_config_socket(&ftp_client2,VP_COM_CLIENT,port,"192.168.1.1"); ftp_client2.protocol = VP_COM_TCP; if(VP_FAILED(vp_com_init(wifi_com()))) { vp_com_close(wifi_com(), &ftp_client2); return -6; } if(VP_FAILED(vp_com_open(wifi_com(), &ftp_client2, &ftp_read, &ftp_write))) { vp_com_close(wifi_com(), &ftp_client2); return -7; } /* Clean up */ vp_com_close(wifi_com(), &ftp_client); vp_com_close(wifi_com(), &ftp_client2); return 0; }
/*--------------------------------------------------------------------------------------------------------------------- Tests the network connection to the drone by fetching the drone version number through the FTP server embedded on the drone. This is how FreeFlight checks if a drone sofware update is required. The FTP connection process is a quick and (very)dirty one. It uses FTP passive mode. ---------------------------------------------------------------------------------------------------------------------*/ int test_drone_connection() { vp_com_socket_t ftp_client; static Write ftp_write = NULL; static Read ftp_read = NULL; int timeout_windows = 1000; /*milliseconds*/ /* Connects to the FTP server */ wifi_config_socket(&ftp_client,VP_COM_CLIENT,FTP_PORT,WIFI_ARDRONE_IP); ftp_client.protocol = VP_COM_TCP; if(VP_FAILED(vp_com_init(wifi_com()))) return -1; if(VP_FAILED(vp_com_open(wifi_com(), &ftp_client, &ftp_read, &ftp_write))) return -2; setsockopt((int32_t)ftp_client.priv, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout_windows, sizeof(timeout_windows) ); /* Clean up */ vp_com_close(wifi_com(), &ftp_client); return 0; }
AT_CODEC_ERROR_CODE host_open( void ) { static bool_t init_ok = FALSE; if( func_ptrs.open != NULL ) return func_ptrs.open(); if( !init_ok ) { COM_CONFIG_SOCKET_AT(&at_socket, VP_COM_CLIENT, AT_PORT, wifi_ardrone_ip); at_socket.protocol = VP_COM_UDP; if(VP_FAILED(vp_com_init(COM_AT()))) { PRINT ("Failed to init AT\n"); vp_com_shutdown( COM_AT() ); return AT_CODEC_OPEN_ERROR; } if(VP_FAILED(vp_com_open(COM_AT(), &at_socket, &atcodec_read, &atcodec_write))) { PRINT ("Failed to open AT\n"); return AT_CODEC_OPEN_ERROR; } // set send_buffer to a low value to limit latency int32_t sendbuf = AT_MUTEX_SNDBUF_SIZE; if ( setsockopt((int32_t)at_socket.priv, SOL_SOCKET, SO_SNDBUF, &sendbuf, sizeof(sendbuf)) ) { PRINT ("Error setting SND_BUF for AT socket\n"); } int opt = IPTOS_PREC_NETCONTROL; int res = setsockopt((int)at_socket.priv, IPPROTO_IP, IP_TOS, &opt, (socklen_t)sizeof(opt)); if (res) { perror("AT stage - setting Live video socket IP Type Of Service : "); } else { printf ("Set IP_TOS ok\n"); } init_ok = TRUE; } return AT_CODEC_OPEN_OK; }
C_RESULT ardrone_control_connect_to_drone() { int res_open_socket; #ifdef _WIN32 int timeout_windows=1000;/*milliseconds*/ #endif struct timeval tv; vp_com_close(COM_CONTROL(), &control_socket); res_open_socket = vp_com_open(COM_CONTROL(), &control_socket, &control_read, &control_write); if( VP_SUCCEEDED(res_open_socket) ) { tv.tv_sec = 1; tv.tv_usec = 0; setsockopt((int32_t)control_socket.priv, SOL_SOCKET, SO_RCVTIMEO, #ifdef _WIN32 (const char*)&timeout_windows, sizeof(timeout_windows) #else (const char*)&tv, sizeof(tv) #endif ); control_socket.is_disable = FALSE; return C_OK; } else { DEBUG_PRINT_SDK("VP_Com : Failed to open socket for control\n"); perror("FTOSFC"); return C_FAIL; } }
C_RESULT vp_stages_output_com_stage_open(vp_stages_output_com_config_t *cfg) { C_RESULT res; res = vp_com_init(cfg->com); if( VP_SUCCEEDED(res) ) { vp_com_local_config(cfg->com, cfg->config); if(cfg->connection && !cfg->connection->is_up) { res = vp_com_connect(cfg->com, cfg->connection, 1); } } if( VP_SUCCEEDED(res) && VP_FAILED(vp_com_open(cfg->com, &cfg->socket, 0, &cfg->write))) res = C_FAIL; if( VP_SUCCEEDED(res) ) { if(cfg->socket.type == VP_COM_SERVER) { res = vp_com_wait_connections(cfg->com, &cfg->socket, &cfg->socket_client, 1); } else { vp_os_memcpy(&cfg->socket_client, &cfg->socket, sizeof(vp_com_socket_t)); } vp_com_sockopt(cfg->com, &cfg->socket_client, cfg->sockopt); } // \todo test return res; }
C_RESULT video_com_stage_connect (video_com_config_t *cfg) { #ifdef _WIN32 int timeout_for_windows=1000; /* timeout in milliseconds */ int sizeinit; #else struct timeval tv; // 1 second timeout tv.tv_sec = 1; tv.tv_usec = 0; #endif C_RESULT res = C_FAIL; if (TRUE == cfg->connected) { PDBG ("Will close"); res = vp_com_close (cfg->com, &cfg->socket); cfg->connected = FALSE; if (VP_FAILED (res)) { PDBG ("Close failed"); return res; } } if( cfg->protocol == VP_COM_PROBE) { PRINT("\n\nPROBING\n"); cfg->socket.protocol = VP_COM_TCP; res = vp_com_open(cfg->com, &cfg->socket, &cfg->read, &cfg->write); if( VP_SUCCEEDED(res) ) { PRINT("\n\nTCP\n"); vp_com_close (cfg->com, &cfg->socket); cfg->protocol = VP_COM_TCP; } else { PRINT("\n\nUDP\n"); cfg->protocol = VP_COM_UDP; } } if( cfg->protocol == VP_COM_UDP ) { cfg->socket.protocol = VP_COM_UDP; cfg->socket.is_multicast = 0; // disable multicast for video cfg->socket.multicast_base_addr = MULTICAST_BASE_ADDR; res = vp_com_open(cfg->com, &cfg->socket, &cfg->read, &cfg->write); if( VP_SUCCEEDED(res) ) { int numi= 1; socklen_t numi1= sizeof(int); #ifdef _WIN32 setsockopt((int32_t)cfg->socket.priv, SOL_SOCKET, SO_RCVTIMEO, SSOPTCAST_RO(&timeout_for_windows), sizeof(timeout_for_windows)); #else setsockopt((int32_t)cfg->socket.priv, SOL_SOCKET, SO_RCVTIMEO, SSOPTCAST_RO(&tv), sizeof(tv)); #endif // Increase buffer for receiving datas. setsockopt( (int32_t)cfg->socket.priv, SOL_SOCKET, SO_DEBUG, SSOPTCAST_RO(&numi), sizeof(numi)); numi = SOCKET_BUFFER_SIZE; setsockopt( (int32_t)cfg->socket.priv, SOL_SOCKET, SO_RCVBUF, SSOPTCAST_RO(&numi),numi1); getsockopt( (int32_t)cfg->socket.priv, SOL_SOCKET, SO_RCVBUF, SSOPTCAST_RW(&numi),&numi1); PDBG ("New buffer size : %d", numi); numi1 = 0; setsockopt( (int32_t)cfg->socket.priv, SOL_SOCKET, SO_DEBUG, SSOPTCAST_RO(&numi1), sizeof(numi1)); cfg->connected = TRUE; } } else if( cfg->protocol == VP_COM_TCP ) { PDBG ("Will open TCP"); res = vp_com_open(cfg->com, &cfg->socket, &cfg->read, &cfg->write); if( VP_SUCCEEDED(res) ) { int numi= 1; socklen_t numi1= sizeof(int); PDBG ("Success open"); vp_com_sockopt(cfg->com, &cfg->socket, cfg->sockopt); #ifdef _WIN32 setsockopt((int32_t)cfg->socket.priv, SOL_SOCKET, SO_RCVTIMEO, SSOPTCAST_RO(&timeout_for_windows), sizeof(timeout_for_windows)); #else setsockopt((int32_t)cfg->socket.priv, SOL_SOCKET, SO_RCVTIMEO, SSOPTCAST_RO(&tv), sizeof(tv)); #endif // Increase buffer for receiving datas. setsockopt( (int32_t)cfg->socket.priv, SOL_SOCKET, SO_DEBUG, SSOPTCAST_RO(&numi), sizeof(numi)); numi = SOCKET_BUFFER_SIZE; setsockopt( (int32_t)cfg->socket.priv, SOL_SOCKET, SO_RCVBUF, SSOPTCAST_RO(&numi),numi1); getsockopt( (int32_t)cfg->socket.priv, SOL_SOCKET, SO_RCVBUF, SSOPTCAST_RW(&numi),&numi1); PDBG ("NEW buffer size : %d", numi); numi1 = 0; setsockopt( (int32_t)cfg->socket.priv, SOL_SOCKET, SO_DEBUG, SSOPTCAST_RO(&numi1), sizeof(numi1)); cfg->connected = TRUE; } } #ifdef _WIN32 sizeinit = strlen("Init"); vp_com_write_socket(&cfg->socket,"Init",&sizeinit); #endif return res; }
AT_CODEC_ERROR_CODE host_open( void ) { static bool_t init_ok = FALSE; if( func_ptrs.open != NULL ) return func_ptrs.open(); if( !init_ok ) { COM_CONFIG_SOCKET_AT(&at_socket, VP_COM_CLIENT, 0, wifi_ardrone_ip); at_socket.protocol = VP_COM_UDP; at_socket.remotePort = AT_PORT; if(VP_FAILED(vp_com_init(COM_AT()))) { PRINT ("Failed to init AT\n"); vp_com_shutdown( COM_AT() ); return AT_CODEC_OPEN_ERROR; } if(VP_FAILED(vp_com_open(COM_AT(), &at_socket, &atcodec_read, &atcodec_write))) { PRINT ("Failed to open AT\n"); return AT_CODEC_OPEN_ERROR; } // set send_buffer to a low value to limit latency int32_t sendbuf = AT_MUTEX_SNDBUF_SIZE; if ( setsockopt((int32_t)at_socket.priv, SOL_SOCKET, SO_SNDBUF, &sendbuf, sizeof(sendbuf)) ) { PRINT ("Error setting SND_BUF for AT socket\n"); } /* * On android, with IP_TOS set, certain devices can't connect to AR.Drone 1 * So we just disable this functionnality to avoid these cases. */ #ifdef USE_ANDROID if (IS_ARDRONE2) { #endif int opt = IPTOS_PREC_NETCONTROL; int res = setsockopt((int)at_socket.priv, IPPROTO_IP, IP_TOS, &opt, (socklen_t)sizeof(opt)); if (res) { perror("AT stage - setting Live video socket IP Type Of Service : "); } else { printf ("Set IP_TOS ok\n"); } #ifdef USE_ANDROID } #endif init_ok = TRUE; } return AT_CODEC_OPEN_OK; }
C_RESULT video_com_stage_open(video_com_config_t *cfg) { #ifdef _WIN32 int sizeinit; #endif C_RESULT res = C_FAIL; if( cfg->protocol == VP_COM_UDP ) { struct timeval tv; #ifdef _WIN32 int timeout_for_windows=1000; /* timeout in milliseconds */ #endif // 1 second timeout tv.tv_sec = 1; tv.tv_usec = 0; cfg->socket.protocol = VP_COM_UDP; cfg->socket.is_multicast = 0; // enable multicast for video cfg->socket.multicast_base_addr = MULTICAST_BASE_ADDR; res = vp_com_open(cfg->com, &cfg->socket, &cfg->read, &cfg->write); if( VP_SUCCEEDED(res) ) { int numi= 1; socklen_t numi1= sizeof(int); #ifdef _WIN32 setsockopt((int32_t)cfg->socket.priv, SOL_SOCKET, SO_RCVTIMEO, SSOPTCAST_RO(&timeout_for_windows), sizeof(timeout_for_windows)); #else setsockopt((int32_t)cfg->socket.priv, SOL_SOCKET, SO_RCVTIMEO, SSOPTCAST_RO(&tv), sizeof(tv)); #endif // Increase buffer for receiving datas. setsockopt( (int32_t)cfg->socket.priv, SOL_SOCKET, SO_DEBUG, SSOPTCAST_RO(&numi), sizeof(numi)); numi= 256*256; setsockopt( (int32_t)cfg->socket.priv, SOL_SOCKET, SO_RCVBUF, SSOPTCAST_RO(&numi),numi1); getsockopt( (int32_t)cfg->socket.priv, SOL_SOCKET, SO_RCVBUF, SSOPTCAST_RW(&numi),&numi1); numi1=0; setsockopt( (int32_t)cfg->socket.priv, SOL_SOCKET, SO_DEBUG, SSOPTCAST_RO(&numi1), sizeof(numi1)); } } else if( cfg->protocol == VP_COM_TCP ) { res = vp_com_open(cfg->com, &cfg->socket, &cfg->read, &cfg->write); if( VP_SUCCEEDED(res) ) { vp_com_sockopt(cfg->com, &cfg->socket, cfg->sockopt); } } /* Stephane */ #ifdef _WIN32 sizeinit = strlen("Init"); vp_com_write_socket(&cfg->socket,"Init",&sizeinit); #endif return res; }
int test_drone_connection() { const char * passivdeModeHeader = "\r\n227 PASV ok ("; vp_com_socket_t ftp_client,ftp_client2; char buffer[1024]; static Write ftp_write = NULL; static Read ftp_read = NULL; int bytes_to_send,received_bytes; int i,L,x[6],port; int timeout_windows = 1000; /*milliseconds*/ vp_os_memset(buffer,0,sizeof(buffer)); wifi_config_socket(&ftp_client,VP_COM_CLIENT,FTP_PORT,WIFI_ARDRONE_IP); ftp_client.protocol = VP_COM_TCP; if(VP_FAILED(vp_com_init(wifi_com()))) return -1; if(VP_FAILED(vp_com_open(wifi_com(), &ftp_client, &ftp_read, &ftp_write))) return -2; setsockopt((int32_t)ftp_client.priv, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout_windows, sizeof(timeout_windows) ); bytes_to_send = _snprintf(buffer,sizeof(buffer),"%s", "USER anonymous\r\nCWD /\r\nPWD\r\nTYPE A\r\nPASV\r\nRETR version.txt\r\n"); ftp_write(&ftp_client,buffer,&bytes_to_send); Sleep(1000); received_bytes = sizeof(buffer); ftp_read(&ftp_client,buffer,&received_bytes); if (received_bytes<1) { vp_com_close(wifi_com(), &ftp_client); return -3; } L=received_bytes-strlen(passivdeModeHeader); for (i=0; i<L; i++) { if (strncmp((buffer+i),passivdeModeHeader,strlen(passivdeModeHeader))==0) break; } if (i==L) { vp_com_close(wifi_com(), &ftp_client); return -4; } i+=strlen(passivdeModeHeader); if (sscanf(buffer+i,"%i,%i,%i,%i,%i,%i)",&x[0],&x[1],&x[2],&x[3],&x[4],&x[5])!=6) { vp_com_close(wifi_com(), &ftp_client); return -5; } port=(x[4]<<8)+x[5]; wifi_config_socket(&ftp_client2,VP_COM_CLIENT,port,"192.168.1.1"); ftp_client2.protocol = VP_COM_TCP; if(VP_FAILED(vp_com_init(wifi_com()))) { vp_com_close(wifi_com(), &ftp_client2); return -6; } if(VP_FAILED(vp_com_open(wifi_com(), &ftp_client2, &ftp_read, &ftp_write))) { vp_com_close(wifi_com(), &ftp_client2); return -7; } received_bytes = sizeof(buffer); ftp_read(&ftp_client2,buffer,&received_bytes); if (received_bytes>0) { buffer[min(received_bytes,sizeof(buffer)-1)]=0; printf("无人机版本 %s 被检测到 ... 按下 <Enter> 开始应用.\n",buffer); getchar(); } vp_com_close(wifi_com(), &ftp_client); vp_com_close(wifi_com(), &ftp_client2); return 0; }
DEFINE_THREAD_ROUTINE( navdata_update, nomParams ) { C_RESULT res; int32_t i, size; uint32_t cks, navdata_cks, sequence = NAVDATA_SEQUENCE_DEFAULT-1; struct timeval tv; #ifdef _WIN32 int timeout_for_windows=1000/*milliseconds*/; #endif navdata_t* navdata = (navdata_t*) &navdata_buffer[0]; tv.tv_sec = 1/*second*/; tv.tv_usec = 0; res = C_OK; if( VP_FAILED(vp_com_open(COM_NAVDATA(), &navdata_socket, &navdata_read, &navdata_write)) ) { printf("VP_Com : Failed to open socket for navdata\n"); res = C_FAIL; } if( VP_SUCCEEDED(res) ) { PRINT("Thread navdata_update in progress...\n"); #ifdef _WIN32 setsockopt((int32_t)navdata_socket.priv, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout_for_windows, sizeof(timeout_for_windows)); /* Added by Stephane to force the drone start sending data. */ if(navdata_write) { int sizeinit = 5; navdata_write( (void*)&navdata_socket, (int8_t*)"Init", &sizeinit ); } #else setsockopt((int32_t)navdata_socket.priv, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof(tv)); #endif i = 0; while( ardrone_navdata_handler_table[i].init != NULL ) { // if init failed for an handler we set its process function to null // We keep its release function for cleanup if( VP_FAILED( ardrone_navdata_handler_table[i].init(ardrone_navdata_handler_table[i].data) ) ) ardrone_navdata_handler_table[i].process = NULL; i ++; } navdata_thread_in_pause = FALSE; while( VP_SUCCEEDED(res) && !ardrone_tool_exit() && bContinue ) { if(navdata_thread_in_pause) { vp_os_mutex_lock(&navdata_client_mutex); num_retries = NAVDATA_MAX_RETRIES + 1; vp_os_cond_wait(&navdata_client_condition); vp_os_mutex_unlock(&navdata_client_mutex); } if( navdata_read == NULL ) { res = C_FAIL; continue; } size = NAVDATA_MAX_SIZE; navdata->header = 0; // Soft reset res = navdata_read( (void*)&navdata_socket, (int8_t*)&navdata_buffer[0], &size ); #ifdef _WIN32 if( size <= 0 ) #else if( size == 0 ) #endif { // timeout PRINT("Timeout\n"); ardrone_navdata_open_server(); sequence = NAVDATA_SEQUENCE_DEFAULT-1; num_retries++; } else num_retries = 0; if( VP_SUCCEEDED( res ) ) { if( navdata->header == NAVDATA_HEADER ) { if( ardrone_get_mask_from_state(navdata->ardrone_state, ARDRONE_COM_WATCHDOG_MASK) ) { // reset sequence number because of com watchdog // This code is mandatory because we can have a com watchdog without detecting it on mobile side : // Reconnection is fast enough (less than one second) sequence = NAVDATA_SEQUENCE_DEFAULT-1; if( ardrone_get_mask_from_state(navdata->ardrone_state, ARDRONE_NAVDATA_BOOTSTRAP) == FALSE ) ardrone_tool_send_com_watchdog(); // acknowledge } if( navdata->sequence > sequence ) { i = 0; ardrone_navdata_unpack_all(&navdata_unpacked, navdata, &navdata_cks); cks = ardrone_navdata_compute_cks( &navdata_buffer[0], size - sizeof(navdata_cks_t) ); if( cks == navdata_cks ) { while( ardrone_navdata_handler_table[i].init != NULL ) { if( ardrone_navdata_handler_table[i].process != NULL ) ardrone_navdata_handler_table[i].process( &navdata_unpacked ); i++; } } else { PRINT("[Navdata] Checksum failed : %d (distant) / %d (local)\n", navdata_cks, cks); } } else { PRINT("[Navdata] Sequence pb : %d (distant) / %d (local)\n", navdata->sequence, sequence); } // remaining = sizeof(navdata); sequence = navdata->sequence; } } } // Release resources alllocated by handlers i = 0; while( ardrone_navdata_handler_table[i].init != NULL ) { ardrone_navdata_handler_table[i].release(); i ++; } } vp_com_close(COM_NAVDATA(), &navdata_socket); DEBUG_PRINT_SDK("Thread navdata_update ended\n"); return (THREAD_RET)res; }
C_RESULT wifi_server_auth(struct in_addr *addr) { Read read = NULL; Write write = NULL; C_RESULT result = C_FAIL; int numretries = 1; uint8_t recvString[BUFFER_SIZE]; /* Buffer for received string */ int recvStringLen; /* Length of received string */ struct timeval tv = {0, 500000}; int on=1; const uint8_t msg[] = AUTH_MSG; struct in_addr to; struct in_addr from; vp_com_socket_t socket; // Initialize sending socket to.s_addr = htonl(WIFI_BROADCAST_ADDR); COM_CONFIG_SOCKET_AUTH(&socket, VP_COM_CLIENT, AUTH_PORT, inet_ntoa(to)); socket.protocol = VP_COM_UDP; if(VP_FAILED(vp_com_init(COM_AUTH()))) { printf("Failed to init Authentification\n"); vp_com_shutdown( COM_AUTH() ); return C_FAIL; } if(VP_FAILED(vp_com_open(COM_AUTH(), &socket, &read, &write))) { printf("Failed to open Authentification\n"); vp_com_shutdown( COM_AUTH() ); return C_FAIL; } if (setsockopt((int)socket.priv, SOL_SOCKET, SO_BROADCAST,(char *)&on,sizeof(on)) < 0) { printf("Failed to set socket option Authentification\n"); vp_com_close(COM_AUTH(), &socket); vp_com_shutdown( COM_AUTH() ); return C_FAIL; } if (setsockopt((int)socket.priv, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) { printf("Failed to set socket option Authentification\n"); vp_com_close(COM_AUTH(), &socket); vp_com_shutdown( COM_AUTH() ); return C_FAIL; } do { int len = strlen((char*)msg); if(write != NULL) { if (VP_FAILED(write(&socket, msg, &len))) { vp_com_close(COM_AUTH(), &socket); vp_com_shutdown( COM_AUTH() ); return C_FAIL; } } printf("Wait authentification\n"); do { if(read != NULL) { recvStringLen = BUFFER_SIZE; if(VP_FAILED(read(&socket, recvString, &recvStringLen))) { vp_com_close(COM_AUTH(), &socket); vp_com_shutdown( COM_AUTH()); return C_FAIL; } } recvString[recvStringLen] = '\0'; } while((recvStringLen != 0) && (strcmp((char *)recvString, AUTH_MSG) == 0)); } while((strcmp((char *)recvString, AUTH_MSG_OK) != 0) && (numretries++ < AUTH_MAX_NUMRETRIES)); if(strcmp((char*)recvString, AUTH_MSG_OK) == 0) { from.s_addr = socket.scn; printf("Authentification ok from %s:%d\n", inet_ntoa(from), socket.port); memcpy(addr, &from, sizeof(struct in_addr)); result = C_OK; } vp_com_close(COM_AUTH(), &socket); vp_com_shutdown( COM_AUTH() ); return result; }