Winsock



  • Hallo ich versuche gerade bei meinem Winsock Server Befehle einzustellen:

    while(rc!=SOCKET_ERROR)
      {
    
                           send(client,buf2,strlen(buf2),0);
                           rc=recv(client,buf,256,0);
    
    				if(rc==0)
    				{
    					std::cout<<"Server hat die Verbindung getrennt..\n";
    					system("PAUSE");
    					return 0;
    				 }
    
    			if(rc==SOCKET_ERROR)
    		        {
    			  std::cout<<"Fehler: recv, fehler code: "<<WSAGetLastError();
    			  break;
    		       	}
    
                    buf[rc]='\0';
    
                         cout<<"Clien sendet\n"<<buf;
    
                         if (buf=="1")
                         {
                         cout<<"Befehl eingeben: ";
                         cin>>command;
                         }
    
      }
    

    Aber wenn ich beim client die 1 drücke dann zeigt geht der Server einfach nicht in diese if abfrage

    if (buf=="1")
                         {
                         cout<<"Befehl eingeben: ";
                         cin>>command;
                         }
    

    Was ist denn da falsch ?

    Kompletter Client:

    //Client
    
    #include <windows.h> //Required for socket init
    #include <iostream>
    using namespace std;
    
    //Client
    
    int main()
    
    {
    
    char buf2[256];
    
    string ip;
    long rc;
    char buf[256];
    int nret;
    
    SOCKET kSock;
    
    WSAData wsdata; 
    WORD wsver=MAKEWORD(2, 0); //Winsock version 2.0
    
    nret=WSAStartup(wsver, &wsdata); //Pass version 2.0 and pointer to implement
    
    		if(nret != 0)
    		{ //Init failed
    		/*A successful return value should be 0 */
    		std::cout<<"Startup failed, error code: "<<WSAGetLastError(); //Returns error code
    		WSACleanup(); //Cleanup Winsock library
    		return -1;
    		}
    
    std::cout<<"Init success\n";
    	 kSock=socket(AF_INET, SOCK_STREAM, 0);
    
    		if(kSock == INVALID_SOCKET)
    		{
    		std::cout<<"Socket init failed";
    		return -1;
    		}
    
    std::cout<<"Socket initialized\n";
    
    sockaddr_in sin;
    sin.sin_port=htons(12345); //Connect to port 12345
    sin.sin_addr.s_addr=inet_addr("127.0.0.1"); //Connect to localhost
    sin.sin_family=AF_INET;
    
    	 rc = connect(kSock,(sockaddr*)&sin, sizeof(sin));
    
    	   if(rc==SOCKET_ERROR)
    			{ //Check the condition
    			std::cout<<"Connect failed, error: "<<WSAGetLastError(); //Returns error code
    			WSACleanup(); //Cleanup the library
    			return -1;
    			}
    
    	else
    	{
    	std::cout<<"Connection successful!\n";
    	}
    
     while(rc!=SOCKET_ERROR)    //wenn kein error, hier handelt es sich um eine endlosschleife dies erkennt man an dem while
      {
       std::cout<<"\nZeichenfolge eingeben [max 256]: ";
       cin>>buf;
       send(kSock,buf,strlen(buf),0);
    
       recv(kSock, buf2, strlen(buf2), 0);
       cout<<"Server Antwortet: "<<buf2;
    
       }
    
    	rc=recv(kSock,buf,256,0);
    	if(rc==0)
            {
    	  cout<<"Server hat die Verbindung getrennt..\n";
    	  system("PAUSE");
    	  return 0;
    	}
    
        if(rc==SOCKET_ERROR)
        {
    	  cout<<"Fehler: recv, fehler code: "<<WSAGetLastError();
    	 system("PAUSE");
    	  return 0;
    	}
    
               buf[rc]='\0';
    
    system("PAUSE");
    
    closesocket(kSock);
    return 0;
    }
    

    Kompletter Server

    #include <windows.h> //Required for socket init
    #include <iostream>
    using namespace std;
    
    //server
    int main()
    {
    
    string command;
    
    char buf2[]="test";
    long rc;
    SOCKET kSock;
    SOCKET client;
    int len;
    
    char buf[256];
    
    WSAData wsdata; //Declare WSAData
    WORD wsver=MAKEWORD(2, 0); //We want Winsock 2.0
    int nret=WSAStartup(wsver, &wsdata); //Pass version 2.0 and pointer to implement
    
    		if(nret != 0)
    		{ //Init failed
    		/*A successful return value should be 0 */
    		std::cout<<"Startup failed, error code: "<<WSAGetLastError(); //Returns error code
    		WSACleanup(); //Cleanup Winsock library
    		return -1;
    		}
    
    std::cout<<"Init success\n";
    kSock=socket(AF_INET, SOCK_STREAM, 0);
    
    		if(kSock == INVALID_SOCKET)
    		{
    		std::cout<<"Socket init failed";
    		return -1;
    		}
    
    std::cout<<"Socket initialized\n";
    sockaddr_in sin;
    sin.sin_port=htons(12345);
    sin.sin_addr.s_addr=INADDR_ANY;
    sin.sin_family=AF_INET;
    
    		if(bind(kSock,(sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
    		{
    		std::cout<<"Failed to bind\n";
    		WSACleanup(); //Cleanup Winsock library
    		return -1;
    		}
    
    std::cout<<"Bind successful!\n";
    
      rc=listen(kSock,10);
    
      if(rc==SOCKET_ERROR)
      {
       std::cout<<"Error "<<GetLastError();
    	system("PAUSE");
    	return 0;
      }
    
      else
      {
        cout<<"acceptSocket ist im listen Modus....\n";
      }
    
    	// Verbindung annehmen
    	 client=accept(kSock,NULL,NULL);
    
    	if(client==INVALID_SOCKET)
            {
    	std::cout<<"Fehler: accept, fehler code: <<"<<WSAGetLastError();
    	return 1;
    	}
    
    	 std::cout<<"Neue Verbindung wurde akzeptiert!\n";
    
       // Daten austauschen
      while(rc!=SOCKET_ERROR)
      {
    
                           send(client,buf2,strlen(buf2),0);
                           rc=recv(client,buf,256,0);
    
    				if(rc==0)
    				{
    					std::cout<<"Server hat die Verbindung getrennt..\n";
    					system("PAUSE");
    					return 0;
    				 }
    
    			if(rc==SOCKET_ERROR)
    		        {
    			  std::cout<<"Fehler: recv, fehler code: "<<WSAGetLastError();
    			  break;
    		       	}
    
                    buf[rc]='\0';
    
                         cout<<"Clien sendet\n"<<buf;
    
                         if (buf=="1")
                         {
                         cout<<"Befehl eingeben: ";
                         cin>>command;
                         }
    
      }
    
    system("PAUSE");
    
    closesocket(client); //Close both socket handles
    closesocket(kSock);
    WSACleanup();
    return 0;
    }
    


  • Hallo,

    ich habe jetzt nicht den ganzen Code betrachtet, aber das hier:

    if (buf=="1")
    

    tut nicht was es soll. buf ist doch ein Zeiger, du willst doch nicht prüfen, ob der Zeiger den gleichen Wert hat wie der Zeiger, der auf die Zeichenkette "1" verweist...Also alles klar, hoffe ich... 😉

    MfG,

    Probe-Nutzer



  • Probe-Nutzer schrieb:

    ich habe jetzt nicht den ganzen Code betrachtet, aber das hier:

    if (buf=="1")
    

    tut nicht was es soll.

    versuch doch mal: if (*buf == '1')
    🙂



  • Hallo,

    versuch doch mal: if (*buf == '1')

    Du Lerneffekt-Zerstörer... 😃

    MfG,

    Probe-Nutzer



  • Wieso ist buf ein Zeiger buf wurde doch gar nicht als Zeiger Initaliert und es Zeigt auch nichts auf buf

    Wie kann man dort erkennen das buf ein Zeiger ist?



  • Arrays sind Zeiger in disguise.



  • mhhm stimmt da war mal irgendwas. ^^ ty



  • Kennt wer den C++ Befehl für gets();

    Weil ich kenn den nur für C
    http://www.cplusplus.com/reference/clibrary/cstdio/gets.html



  • http://www.cplusplus.com/reference/iostream/cin.html

    #include <string>
    ...
    std::string str;
    
    std::cin >> str;
    



Anmelden zum Antworten