Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WS2]Wczytywanie tekstu i podawanie go do funkcji send()

Ostatnio zmodyfikowano 2013-02-09 10:20
Autor Wiadomość
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:
C/C++
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:

C/C++
//ws2 - inicjalizacja i inne
std::cout << "Wybrano klient" << std::endl;
std::cout << "Jaka wiadomosc chcesz wyslac do serwera: " << std::endl;
std::string wczyt;
std::getline( std::cin, wczyt ); ///!!!!! tu zaczyna pomijać kod

//łączenie
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 ); // a tu już działa

Co tu jest nie tak (używając zwykłego char[] zamiast wczyt.c_str() w funkcji send program działa normalnie)
P-75922
mactec
» 2013-02-07 22:34:52
Spróbuj tak
wczyt.length()
P-75924
ridic14
Temat założony przez niniejszego użytkownika
» 2013-02-08 18:19:44
Nie działa dalej :P
P-75958
mactec
» 2013-02-08 18:39:00
A weź podaj cały kod.
P-75959
ridic14
Temat założony przez niniejszego użytkownika
» 2013-02-08 18:48:11
Serio? Długi jest:

C/C++
#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()
{
    //inne
    HANDLE uchwyt;
    uchwyt = GetStdHandle( STD_OUTPUT_HANDLE );
   
    //ws
    WSADATA wsaData;
    SOCKET mainSocket;
    sockaddr_in service;
   
    ws2_init( wsaData, mainSocket, service );
   
    int scc = 0; // 1 - serwer 2 - klient
   
    std::cout << "[1] - Serwer\n[2] - Klient\nWyb\242r:";
    std::cin >> scc;
   
    if( scc == 1 ) ///SERWER
    {
        std::cout << "Wybrano serwer" << std::endl;
       
        //bindowanie
        if( bind( mainSocket,( SOCKADDR * ) & service, sizeof( service ) ) == SOCKET_ERROR )
        {
            printf( "bind() failed.\n" );
            closesocket( mainSocket );
            return 1;
        } //if
       
        if( listen( mainSocket, 1 ) == SOCKET_ERROR ) printf( "Error listening on socket.\n" );
       
        //Łącznośc HALO?!
        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" );
       
    } //if2
   
    ///KLIENT
    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 if
   
    else /// ZLY WYBOR
    {
        std::cout << "Wybrano nieodpowiedni numer" << std::endl;
        system( "pause" );
    } //else
   
    WSACleanup();
    return returnVar;
}

void ws2_init( WSADATA & wsa, SOCKET & mainSocket, sockaddr_in & service )
{
    //zainicjować Winsock
    int result = WSAStartup( MAKEWORD( 2, 2 ), & wsa );
    if( result != NO_ERROR ) printf( "[INFO]Initialization error.\n" );
   
    //utworzenie gniazda
    mainSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    if( mainSocket == INVALID_SOCKET )
    {
        printf( "[INFO]Error creating socket: %ld\n", WSAGetLastError() );
        WSACleanup();
        returnVar = 1;
    }
   
    //struktura sockaddr_in
    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 );
}
P-75960
kubawal
» 2013-02-08 18:51:59
Spróbuj
wczyt.data()
 zamiast c_str().
P-75961
ridic14
Temat założony przez niniejszego użytkownika
» 2013-02-08 18:59:16
Działa ale nie wiem dlaczego to:

C/C++
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?:

C/C++
cin >> zmienna;
getline( cin, str );
P-75962
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.
P-75989
« 1 » 2
  Strona 1 z 2 Następna strona