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

Winsock i funkcja recv().

Ostatnio zmodyfikowano 2015-10-28 08:24
Autor Wiadomość
Rock24
Temat założony przez niniejszego użytkownika
Winsock i funkcja recv().
» 2015-10-27 20:22:02
Witam.
Mam problem z poprawnym odebraniem przesłanej do serwera wiadomości.

Kod serwera:
C/C++
#include <iostream>
#include <winsock2.h>
using namespace std;

int main()
{
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD( 2, 2 ), & wsaData );
    if( iResult != NO_ERROR ) {
        cout << "Cos jest zle";
        return 1;
    }
    int serwer, klient;
    struct sockaddr_in serw;
    serw.sin_family = AF_INET;
    serw.sin_port = htons( 1234 );
    serw.sin_addr.s_addr = inet_addr( "127.0.0.1" );
   
    struct sockaddr_in klien;
   
    serwer = socket( AF_INET, SOCK_STREAM, 0 );
   
    int serwlen;
    int klienlen;
    klienlen = sizeof( sockaddr_in );
    serwlen = sizeof( serw );
    bind( serwer,( struct sockaddr * ) & serw, serwlen );
    listen( serwer, 10 );
    klient = accept( serwer,( struct sockaddr * ) & klien, & klienlen );
    cout << "Podlaczony klient to " << inet_ntoa( klien.sin_addr ) << "\n";
   
    char recvbu[ 256 ];
    recv( klient, recvbu, 256, 0 );
    cout << recvbu;
   
    closesocket( klient );
    closesocket( serwer );
    WSACleanup();
   
    return 0;
}
 
Kod klienta:

C/C++
#include <iostream>
#include <winsock2.h>
using namespace std;

int main()
{
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD( 2, 2 ), & wsaData );
    if( iResult != NO_ERROR ) {
        cout << "Cos jest zle";
        return 1;
    }
   
    int gniazdo;
    struct sockaddr_in klient;
    klient.sin_family = AF_INET;
    klient.sin_port = htons( 1234 );
    klient.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    cout << "Klient laczy sie do serwera o adresie " << inet_ntoa( klient.sin_addr ) << "\n";
   
    gniazdo = socket( AF_INET, SOCK_STREAM, 0 );
    connect( gniazdo,( struct sockaddr * ) & klient, sizeof( struct sockaddr ) );
   
    char * msg = "To jest wiadomosc do serwera\n";
    int len;
    len = strlen( msg );
    send( gniazdo, msg, len, 0 );
   
    char * msg_dwa = "To jest druga wiadomosc\n";
    int len_dwa = strlen( msg_dwa );
    send( gniazdo, msg_dwa, len_dwa, 0 );
   
    closesocket( gniazdo );
    WSACleanup();
    return 0;
}

Wynik:

Podlaczony klient to 127.0.0.1
To jest wiadomosc do serwera
To jest druga wiadomosc
╩G   // chodzi mi o to
Process returned 0 (0x0)   execution time : 23.981 s
Press any key to continue.

Chodzi mi o pozbycie się tych krzaczków z pod drugiej wiadomości.
Docenił bym też porady dotyczące obsługi odbierania/wysyłania w winsock (oraz ogólnie programowania sieciowego) gdyż dopiero zaczynam nauke.


Poradziłem sobie z tym zmieniając:
C/C++
char recvbu[ 256 ];
recv( klient, recvbu, 256, 0 );
cout << recvbu;

na:

C/C++
char recvbu[ 256 ];
int bajty;
bajty = recv( klient, recvbu, 256, 0 );
memset( &( recvbu[ bajty - 1 ] ), 0,( sizeof( recvbu ) - bajty ) );
cout << recvbu;

Jest jakiś inny sposób?
P-139268
1aam2am1
» 2015-10-28 08:24:26
C/C++
char * msg = "To jest wiadomosc do serwera\n";
int len;
len = strlen( msg ) + 1; //znak 0 tez musisz wysyłać
send( gniazdo, msg, len, 0 );

/***/
char * msg_dwa = "To jest druga wiadomosc\n";
int len_dwa = strlen( msg_dwa ) + 1; //znak 0 tez musisz wysyłać
send( gniazdo, msg_dwa, len_dwa, 0 );
P-139280
« 1 »
  Strona 1 z 1