ridic14 Temat założony przez niniejszego użytkownika |
[WS2]Wczytywanie tekstu i podawanie go do funkcji send() » 2013-02-07 22:19:49 Problem nie wiem sam z czym(w sumie wiem chyba coś ze string'iem) Takie coś samo w sobie działa normalnie: std::cout << "Jaka wiadomosc chcesz wyslac do serwera: " << std::endl; std::string wczyt; std::getline( std::cin, wczyt ); std::cout << wczyt;
gdy robię tak to metoda getline w ogóle się nie wykonuje i pomija kod aż do printf: std::cout << "Wybrano klient" << std::endl; std::cout << "Jaka wiadomosc chcesz wyslac do serwera: " << std::endl; std::string wczyt; std::getline( std::cin, wczyt );
if( connect( mainSocket,( SOCKADDR * ) & service, sizeof( service ) ) == SOCKET_ERROR ) { printf( "Failed to connect.\n" ); WSACleanup(); return 1; }
bytesSent = send( mainSocket, wczyt.c_str(), strlen( wczyt.c_str() ), 0 ); printf( "[INFO]Bytes sent: %ld\n", bytesSent );
Co tu jest nie tak (używając zwykłego char[] zamiast wczyt.c_str() w funkcji send program działa normalnie) |
|
mactec |
» 2013-02-07 22:34:52 Spróbuj tak wczyt.length() |
|
ridic14 Temat założony przez niniejszego użytkownika |
» 2013-02-08 18:19:44 Nie działa dalej :P |
|
mactec |
» 2013-02-08 18:39:00 A weź podaj cały kod. |
|
ridic14 Temat założony przez niniejszego użytkownika |
» 2013-02-08 18:48:11 Serio? Długi jest: #include <cstdio> #include <cstdlib> #include <iostream> #include <cstring>
#include <winsock2.h>
int returnVar = 0;
void ws2_init( WSADATA & wsa, SOCKET & mainSocket, sockaddr_in & service );
int main() { HANDLE uchwyt; uchwyt = GetStdHandle( STD_OUTPUT_HANDLE ); WSADATA wsaData; SOCKET mainSocket; sockaddr_in service; ws2_init( wsaData, mainSocket, service ); int scc = 0; std::cout << "[1] - Serwer\n[2] - Klient\nWyb\242r:"; std::cin >> scc; if( scc == 1 ) { std::cout << "Wybrano serwer" << std::endl; if( bind( mainSocket,( SOCKADDR * ) & service, sizeof( service ) ) == SOCKET_ERROR ) { printf( "bind() failed.\n" ); closesocket( mainSocket ); return 1; } if( listen( mainSocket, 1 ) == SOCKET_ERROR ) printf( "Error listening on socket.\n" ); SOCKET acceptSocket = SOCKET_ERROR; printf( "Prosze czeka\206 na po\210aczenie (UWAGA: to moze trwac w nieskonczono\230\206)\n" ); while( acceptSocket == SOCKET_ERROR ) { acceptSocket = accept( mainSocket, NULL, NULL ); } printf( "Klient po\210aczony!.\n" ); mainSocket = acceptSocket; system( "pause" ); int bytesSent; int bytesRecv = SOCKET_ERROR; char sendbuf[ 300 ]; std::cin >> sendbuf; char recvbuf[ 300 ] = ""; bytesRecv = recv( mainSocket, recvbuf, 32, 0 ); SetConsoleTextAttribute( uchwyt, 0x3 ); printf( "[Klient]: %s\n", recvbuf ); SetConsoleTextAttribute( uchwyt, 0x7 ); bytesSent = send( mainSocket, sendbuf, strlen( sendbuf ), 0 ); printf( "[INFO]: Bytes sent: %ld\n", bytesSent ); printf( "[INFO]: Bytes received: %ld\n", bytesRecv ); system( "pause" ); } else if( scc == 2 ) { std::cout << "Wybrano klient" << std::endl; std::cout << "Jak wiadomo chcesz wys do serwera: " << std::endl; std::string wczyt; std::getline( std::cin, wczyt ); if( connect( mainSocket,( SOCKADDR * ) & service, sizeof( service ) ) == SOCKET_ERROR ) { printf( "Failed to connect.\n" ); WSACleanup(); return 1; } int bytesSent; int bytesRecv = SOCKET_ERROR; char * sendbuf = new char[ wczyt.size() + 1 ]; std::strcpy( sendbuf, wczyt.c_str() ); char recvbuf[ 300 ] = ""; bytesSent = send( mainSocket, wczyt.c_str(), strlen( wczyt.c_str() ), 0 ); printf( "[INFO]Bytes sent: %ld\n", bytesSent ); while( bytesRecv == SOCKET_ERROR ) { bytesRecv = recv( mainSocket, recvbuf, 32, 0 ); if( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) { printf( "[INFO]Connection closed.\n" ); system( "pause" ); break; } if( bytesRecv < 0 ) return 1; printf( "[INFO]Bytes received: %ld\n", bytesRecv ); SetConsoleTextAttribute( uchwyt, 0x4 ); printf( "[Serwer]: %s\n", recvbuf ); SetConsoleTextAttribute( uchwyt, 0x7 ); } system( "pause" ); } else { std::cout << "Wybrano nieodpowiedni numer" << std::endl; system( "pause" ); } WSACleanup(); return returnVar; }
void ws2_init( WSADATA & wsa, SOCKET & mainSocket, sockaddr_in & service ) { int result = WSAStartup( MAKEWORD( 2, 2 ), & wsa ); if( result != NO_ERROR ) printf( "[INFO]Initialization error.\n" ); mainSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if( mainSocket == INVALID_SOCKET ) { printf( "[INFO]Error creating socket: %ld\n", WSAGetLastError() ); WSACleanup(); returnVar = 1; } memset( & service, 0, sizeof( service ) ); service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr( "216.239.51.99" ); service.sin_port = htons( 27715 ); } |
|
kubawal |
» 2013-02-08 18:51:59 Spróbuj wczyt.data() zamiast c_str(). |
|
ridic14 Temat założony przez niniejszego użytkownika |
» 2013-02-08 18:59:16 Działa ale nie wiem dlaczego to: std::cout << "Jak wiadomo chcesz wys do serwera: " << std::endl; std::string wczyt; std::getline( std::cin, wczyt );
Działa na początku funkcji main a po spełnieniu warunku if(klient czy serwer) już nie działa :( EDIT: jak się przed getline użyje cin to nie działa?: cin >> zmienna; getline( cin, str );
|
|
Monika90 |
» 2013-02-08 23:20:39 Po wczytaniu liczby za pomocą std::cin >> scc; w strumienu zostaje znak końca linii '\n', przez co getline wczyta pustą linię. Dodaj std::cin.ignore(9999, '\n'); po std::cin >> scc, albo przed std::getline. |
|
« 1 » 2 |