Winsock i funkcja recv().
Ostatnio zmodyfikowano 2015-10-28 08:24
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: #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: #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: char recvbu[ 256 ]; recv( klient, recvbu, 256, 0 ); cout << recvbu; na: 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? |
|
1aam2am1 |
» 2015-10-28 08:24:26 char * msg = "To jest wiadomosc do serwera\n"; int len; len = strlen( msg ) + 1; send( gniazdo, msg, len, 0 );
char * msg_dwa = "To jest druga wiadomosc\n"; int len_dwa = strlen( msg_dwa ) + 1; send( gniazdo, msg_dwa, len_dwa, 0 );
|
|
« 1 » |