int Connection::read_integer( int fd, int *data ) { int ret, debug=0; do { ret = my_receive( fd, data, sizeof(int) ); if( ret!=sizeof(int) ) { if(debug) tl_message ("read miss : ret = %d : data = %d [%d][%d][%d][%d]", ret, *data, data[0], data[1], data[2], data[3] ); } } while (ret!=sizeof(int) ); return 0; }
int udp_test(std::vector<std::string> args) { size_t argc = args.size(); for (size_t i = 0; i < argc; ++i) { if (i == 0) continue; std::cout << "Param[" << i << "] : " << args[i] << std::endl; } if (args.size() >= 3) { if (StringEqual(args[2].c_str(), "send")) { my_send(); } else { my_receive(); } } return 0; }
/*---------------------------------------------------------------------------*/ int Connection::Receive (int type, gpointer data) { int ret, debug=0; char word[MAX_STRING]; // if (!connection) return CONNECTION_FAIL; if (type & CONNECTION_SELECT) { if (Select( )==CONNECTION_FAIL) return CONNECTION_FAIL; } if( type & CONNECTION_BYTE ) { // 通信できていない場合は Retry するようにする : 1999 Apr 26th int fd; fd = FdRead( ); do { ret = my_receive (fd, data, sizeof(char)); if (ret==-1) { tl_warning ("%s : STRING : Error(%d)!", GetName(), errno); return CONNECTION_FAIL; } } while( ret!=1 ); } else if( (type & CONNECTION_STRING) ) { // C で文字列を受けとる時は最後の '\n' を '\0' に変換する int fd, ret, p, debug=0; fd = FdRead( ); for (p=0;;p++) { do { ret = my_receive( fd, (gpointer)((char *)data+p), 1 ); if (ret==FALSE) tl_message ("%s : STRING : Error!", GetName()); if(debug) tl_message ("%c(%d)::", ((char *)data)[p], ((char *)data)[p]); } while( ret!=sizeof(char) ); if ( ((char *)data)[p]=='\n' ) break; if (ret!=sizeof(char) || p>=MAX_STRING) { tl_message ("%s : STRING : OverFlow Error!", name ); } } ((char *)data)[p] = '\0'; } else if( type & CONNECTION_WORD ) { FILE *fp; fp = FpRead(); if( fgets( word, MAX_STRING, fp )==NULL ) { tl_message ("WORD : Error!"); return CONNECTION_FAIL; } sscanf (word, "%s", (char *)data); } else if (type & CONNECTION_INTEGER) { int fd, value=0; fd = FdRead(); ret = my_receive( fd, &value, sizeof(int) ); if( ret!=sizeof(int) ) { tl_message ("INTEGER : Error!"); return CONNECTION_FAIL; } *( (int *)data ) = value; } else if (type & CONNECTION_DOUBLE) { int fd; double value=0.0; fd = FdRead (); ret = my_receive (fd, &value, sizeof(double)); if (ret!=sizeof(double)) { tl_warning ("<DOUBLE> : ret = %d ", ret); return FALSE; } *( (double *)data ) = value; } else if (type & CONNECTION_TLVECTOR) Receive_tlVector ((tlVector_t *)data); //KEEP AN EYE OVER HERE !!!! else if (type & CONNECTION_STREAM ) { // STREAM 型の場合,最初に int 型で長さを受けとってから,データをもらう int fd, length=0, p, tmp=5; fd = FdRead(); if(stream == NULL ) { tl_message ("STREAM :%s : Point is NULL!", GetName()); return CONNECTION_FAIL; } read_integer (fd, &tmp); tl_message ("Read Check 1 : length = %d", tmp); read_integer (fd, &length); tl_message ("Read Check 2 : length = %d", length); fsync(fd); if( tmp!=length ) { tl_message ("STREAM :%s : length mismatch %d!=%d", GetName(), tmp, length); ret = my_receive( fd, &tmp, sizeof(int) ); return CONNECTION_FAIL; } tl_message ("STREAM :%s : length = %d", GetName(), length ); *((int *)data) = length; if( length<=0 ) { tl_message ("STREAM :%s : length error!", GetName()); return CONNECTION_FAIL; } for (p=0; p<length; p++) { ret = my_receive( fd, (stream)+p, 1 ); if (ret!= 1) { tl_warning ("STREAM :%s : read error!", GetName()); return CONNECTION_FAIL; } } if(debug) tl_message ("STREAM :%s (2): length = %d", GetName(), length); } else { tl_message ("%s: Error! Set Send Type.(%d)", GetName(), type); return CONNECTION_FAIL; } return CONNECTION_SUCCESS; }