socket_connect_problem



  • Hallo!
    Und zwar hab ich diesmal folgendes (ich glaub simples) Problem!
    Hab einen einfachen Server unter Unix programmiert:

    #include <netdb.h>
    #include <netinet/in.h>
    
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <stdio.h>
    
    int main (void)
    {
        int sock;
        socklen_t sin_size=sizeof(sockaddr_in); 
        struct sockaddr_in svr;
    
        svr.sin_family=AF_INET;
        svr.sin_port=htonl(12345);
        svr.sin_addr.s_addr=INADDR_ANY;
    
        if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {
            puts("Fehler beim Erstellen des Socket!\n");
            return 1;
        }
        else
            puts ("Socket erstellt\n");
    
        if (bind (sock, (struct sockaddr *) &svr, sizeof(svr)) !=0)
        {
            puts ("Fehler beim Binden des Socket!\n");
            return 1;
        }
        else puts ("Socket an Port gebunden\n");
    
        if ((listen(sock, 3)) == -1)
        {
            puts ("Fehler beim Warten des Socket!\n");
            return 1;
        }
        else puts ("Socket wartet\n");
    
        for (;;)
        {
    
            if (accept (sock, (struct sockaddr *) &svr, &sin_size) != 0)
            {
                puts ("Fehler beim Handeln der Clients!\n");
                return 1;
            }
            else
                puts ("Verbindung ok");
            //puts ("Verbindung von %s\n", inet_ntoa(sock.sin_addr));
        }
    
    //  close (sock);
        return 0;
    }
    

    und einen einfachen Client unter Windows:

    #include "stdafx.h"
    #include <io.h>
    #include <windows.h>
    #include <winsock.h>
    #include <stdio.h>
    #include <conio.h>
    
    //Prototypen
    int startWinsock(void);
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr);
    int main(int argc, char** argv)
    
    {
      long rc;
      SOCKET s;
      SOCKADDR_IN addr;
      char buf[256];
      if(argc<2)
    
      {
    
        printf("Usage: sock <hostname oder ip des servers>\n");
                return 1;
    
      }
    
      // IP
      struct hostent* host;
      BYTE ipAdressTeil[4];
      char ipAdressBuffer[64];
      char hostName[MAX_PATH];
      int x;
    
      // Winsock starten
      rc=startWinsock();
      if(rc!=0)
      {
        printf("Fehler: startWinsock, fehler code: %d\n",rc);
        return 1;
      }
      else
      {
        printf("Winsock gestartet!\n");
      }
    
       if(SOCKET_ERROR != gethostname(hostName,sizeof(hostName)))
      {
          if (NULL != (host=gethostbyname(hostName)))
          {
              for (x=0; (host->h_addr_list[x]);x++)
              {
                  ipAdressTeil[0] = host->h_addr_list[x][0];
                  ipAdressTeil[1] = host->h_addr_list[x][1];
                  ipAdressTeil[2] = host->h_addr_list[x][2];
                  ipAdressTeil[3] = host->h_addr_list[x][3];
    
                  sscanf(ipAdressBuffer,"%d.%d.%d.%d", &ipAdressTeil[0], &ipAdressTeil[1], &ipAdressTeil[2], &ipAdressTeil[3]);
              }
          }
      } else
           printf ("Socket Error");
    
      // Socket erstellen
      s=socket(AF_INET,SOCK_STREAM,0);
      if(s==INVALID_SOCKET)
      {
        printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Socket erstellt!\n");
      }
    
      // Verbinden
      memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
      addr.sin_family=AF_INET;
      addr.sin_port=htons(12345); // wir verwenden mal port 12345
     // addr.sin_addr.s_addr=inet_addr("192.168.0.3"); // zielrechner ist unser eigener
    
      rc=getAddrFromString(argv[1],&addr);
      if(rc==SOCKET_ERROR)
      {
        printf("IP für %s konnte nicht aufgeloest werden\n", argv[1]);
        return 1;
      }
      else
      {
        printf("IP aufgeloest!\n");
      }
    
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Ihre IP - Adresse: %d.%d.%d.%d ist verbunden mit Zielhost\n",ipAdressTeil[0], ipAdressTeil[1], ipAdressTeil[2], ipAdressTeil[3]);
      }
    
        HWND hWnd,          
        unsigned int wMsg,  
        long lEvent         
    
      // Daten austauschen
      while(rc!=SOCKET_ERROR)
      {
        printf("\nZeichenfolge eingeben [max 256]: ");
        gets(buf);
        send(s,buf,strlen(buf),0);
        //rc=recv(s,buf,256,0);
    
        rc = WSAAsyncSelect(s, hWnd, wMsg, FD_READ|FD_WRITE);
    
        if(rc==0)
        {
          printf("Server hat die Verbindung getrennt..\n");
          break;
        }
        if(rc==SOCKET_ERROR)
        {
          printf("Fehler: recv, fehler code: %d\n",WSAGetLastError());
          break;
        }
        buf[rc]='\0';
        printf("\nServer schreit: %s\n",wMsg);
      }
      closesocket(s);
      WSACleanup();
      return 0;
    }
    
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)
    {
     long rc;
     unsigned long ip;
     HOSTENT* he;
     if (hostnameOrIp==NULL || addr==NULL)
         return SOCKET_ERROR;
     ip=inet_addr(hostnameOrIp);
     if (ip!=INADDR_NONE)
     {
       addr->sin_addr.s_addr=ip;
       return 0;
     }
     else
     {
         he=gethostbyname(hostnameOrIp);
         if (he==NULL)
         {
             return SOCKET_ERROR;
         }
         else
         {
             memcpy(&(addr->sin_addr),he->h_addr_list[0],4);
         }
    return 0;
     }
    
    }
    

    Beim Aufruf meines Clients bekomm ich die Fehlermeldung, dass mein Client beim connect fehlgeschlagen ist (Fehlercode 10061).
    Ich geb die IP - Adresse über die Konsolenandwendung ein (vorheriger ping an die Serveradresse hat funktioniert); doch scheitert mein Verbindungsaufbau.
    Kann mir da jemand weiterhelfen?



  • ich hatte schonmal das Phänomen dass ein connect nur über den Namen funktionierte.. gethostbyname() konnte keine IP's auflösen, sodass ein
    connect nur über den NameServer oder die system32\driver\etc\hosts möglich war..

    mfg



  • hab den Client jetzt ohne IP - auflösen:

    #include <windows.h> 
    #include <winsock.h> 
    #include <stdio.h> 
    
    void WSAInit(void) 
     { 
      WORD wVersionReg = MAKEWORD(1, 1); 
      WSADATA wsaData; 
      if (int err = WSAStartup(wVersionReg, &wsaData) != 0) 
       { 
        puts("Fehler: Initialisieren - WinSock.dll!"); 
       } 
     } 
    
    int main(void) 
     { 
      SOCKET sock = INVALID_SOCKET; 
    
      struct sockaddr_in svr; 
    
      svr.sin_family = AF_INET; 
      svr.sin_addr.s_addr = inet_addr("192.168.0.2"); 
      svr.sin_port = htons(12345); 
    
      WSAInit(); 
    
      if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 
       { 
        puts("Fehler beim Erstellen des Socket!\n"); 
        return 1; 
       } 
    
      if ( connect (sock, (struct sockaddr *) &svr, sizeof(svr)) == SOCKET_ERROR) 
       { 
        puts("Es kam keine Verbindung zustande!\n"); 
        return 1; 
       } 
    
      closesocket(sock); 
    
      WSACleanup(); 
    
      return 0; 
     }
    

    Hab einen Server unter Windows geschrieben; da funktionierts suppi!
    Nur unter Linux will das nicht funktionieren! was mach ich falsch?


Anmelden zum Antworten