Wie erweitern?
-
hallo,
ich habe nun ein socket programm geschrieben, womit der client mit dem server kommumnzieren kann, aber ich find das ein bisschen dumm, dass wenn z.b. der client was schreib und abschickt, dann muss er warten bis er eine antwort vom server bekommt... kann man das irgendwie ändern, also dass der client gleich nach dem gesendeten noch etwas senden kann?
hier mal mein code:
//main.cpp #include "WinSock2.h" #include <iostream> #include <string> #include "Socket.h" using namespace std; int main() { int choice; int port = 666; string ipAddress; bool done = false; char recMessage[STRLEN]; char sendMessage[STRLEN]; cout<<"1) Hosten"<<endl; cout<<"2) Joinen"<<endl; cout<<"3) Beenden"<<endl; cin>>choice; if ( choice == 3 ) exit(0); else if ( choice == 2 ) { cout<<"127.0.0.1"<<endl; cin>>ipAddress; ClientSocket sockClient; cout<<"einen moment, bitte..."<<endl; sockClient.ConnectToServer( ipAddress.c_str(), port ); while ( !done ) { sockClient.GetAndSendMessage(); cout<<"\t--WARTEN--"<<endl; sockClient.RecvData( recMessage, STRLEN ); cout<<"User2: > "<< recMessage <<endl; if ( strcmp( recMessage, "end" ) == 0|| strcmp( sendMessage, "end" ) == 0 ) { done = true; } } sockClient.CloseConnection(); } else if ( choice == 1 ) { ServerSocket sockServer; cout<<"HOSTING..."<<endl; sockServer.StartHosting( port ); while ( !done ) { sockServer.RecvData( recMessage, STRLEN ); cout<<"User2: > "<< recMessage <<endl; sockServer.GetAndSendMessage(); if ( strcmp( recMessage, "end" ) == 0 || strcmp( sendMessage, "end" ) == 0 ) { done = true; } } } }//Socket.cpp #include "Socket.h" Socket::Socket() { if( WSAStartup( MAKEWORD(2, 2), &wsaData ) != NO_ERROR ) { cerr<<"Fehler mit WSAStartup!\n"; system("pause"); WSACleanup(); exit(10); } mySocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( mySocket == INVALID_SOCKET ) { cerr<<"Fehler beim Hosten..."<<endl; system("pause"); WSACleanup(); exit(11); } myBackup = mySocket; } Socket::~Socket() { WSACleanup(); } bool Socket::SendData( char *buffer ) { send( mySocket, buffer, strlen( buffer ), 0 ); return true; } bool Socket::RecvData( char *buffer, int size ) { int i = recv( mySocket, buffer, size, 0 ); buffer[i] = '\0'; return true; } void Socket::CloseConnection() { closesocket( mySocket ); mySocket = myBackup; } void Socket::GetAndSendMessage() { char message[STRLEN]; cin.ignore(); cout<<"User1: > "; cin.get( message, STRLEN ); SendData( message ); } void ServerSocket::StartHosting( int port ) { Bind( port ); Listen(); } void ServerSocket::Listen() { if ( listen ( mySocket, 1 ) == SOCKET_ERROR ) { cerr<<"ServerSocket: Verbindungsfehler\n"; system("pause"); WSACleanup(); exit(15); } acceptSocket = accept( myBackup, NULL, NULL ); while ( acceptSocket == SOCKET_ERROR ) { acceptSocket = accept( myBackup, NULL, NULL ); } mySocket = acceptSocket; } void ServerSocket::Bind( int port ) { myAddress.sin_family = AF_INET; myAddress.sin_addr.s_addr = inet_addr( "0.0.0.0" ); myAddress.sin_port = htons( port ); if ( bind ( mySocket, (SOCKADDR*) &myAddress, sizeof( myAddress) ) == SOCKET_ERROR ) { cerr<<"ServerSocket: Verbindungsfehler\n"; system("pause"); WSACleanup(); exit(14); } } void ClientSocket::ConnectToServer( const char *ipAddress, int port ) { myAddress.sin_family = AF_INET; myAddress.sin_addr.s_addr = inet_addr( ipAddress ); myAddress.sin_port = htons( port ); if ( connect( mySocket, (SOCKADDR*) &myAddress, sizeof( myAddress ) ) == SOCKET_ERROR ) { cerr<<"ClientSocket: Du konntest dich nicht erfolgreich verbinden\n"; system("pause"); WSACleanup(); exit(13); } }// Socket.h #pragma once #pragma comment(lib, "Ws2_32.lib") #include "WinSock2.h" #include <iostream> #include <string> using namespace std; const int STRLEN = 256; class Socket { protected: WSADATA wsaData; SOCKET mySocket; SOCKET myBackup; SOCKET acceptSocket; sockaddr_in myAddress; public: Socket(); ~Socket(); bool SendData( char* ); bool RecvData( char*, int ); void CloseConnection(); void GetAndSendMessage(); }; class ServerSocket : public Socket { public: void Listen(); void Bind( int port ); void StartHosting( int port ); }; class ClientSocket : public Socket { public: void ConnectToServer( const char *ipAddress, int port ); };danke schonmal

-
Dr. House schrieb:
kann man das irgendwie ändern, also dass der client gleich nach dem gesendeten noch etwas senden kann?
Klar, verändere dein Protokoll und führe Threads ein für das Empfangen und Senden. Dann können solche Dinge asynchron passieren.
Grüssli
-
Boah cool, danke Dr. house... Nach sowas hab ich schon lange gesucht, aber ich verstehe Draveres antwor nicht^^ kannst du vllt ein kurzes bsp geben