WSAStartup wird nicht ausgeführt, WSAGetLastError 10093



  • Hallo nochmal
    immernoch mit embedded Visual C++ SP4 versuche ich gerade einen Hostnamen aufzulösen. Per ping-Befehl in der Konsole konnte der Hostname aufgelöst werden, aber wenn ich den Debugger starte wird mir rc==0 ausgegeben, aber WSAGetLastError liefert 10093, was so viel heist wie WSAStartup() wurde nich ausgeführt, war fehlerhaft, etwas an der Netzwerkkonfiguration ist falsch, oder WSACleanup() wurde zu oft ausgeführt. Ich habe eher bedenken dass es bei mir ein Versionsproblem ist.

    #include "stdafx.h"
    #include "Scannerclient.h"
    #include "ScannerclientDlg.h"
    #include "string.h"
    #include "winsock.h"
    #include "windows.h"
    #include "atlconv.h"
    
    ....
    
    int startWinSock(void);
    ....
    void CScannerclientDlg::OnButtonAbschicken() 
    {
    	USES_CONVERSION;
    	CString cs_eingabe, cs_hostname(""), cs_port(""), cs_debug;
    	long rc;
    	char buf[1024];
    	SOCKET socket1;
    	SOCKADDR_IN addr;
    	HOSTENT *he;
    	DWORD dw_Error;
    ....
    
    			rc=startWinSock();
    			AfxSocketInit(); 
    			he=gethostbyname(T2A(cs_hostname));
    			if (he==NULL)
    				{
    					dw_Error=WSAGetLastError();
    
    				}
    			WSACleanup();
    			}
    ....
    }
    
    int startWinSock(void)
    {
    	WSADATA wsa;
    	return WSAStartup(MAKEWORD(2,2), &wsa);
    }
    

    Das kuriose ist eben, dass ich bei dem device die winsock.h und nicht winsock2.h nutze. Wenn ich die Winsock2.h inkludiere kommen 20 fehler und 19 Warnungen (sollte Bedarf bestehen kann ich diese sogar posten). Nun habe ich schon verschiedene Versionen des WinSock probiert (MAKEWORD(1,0 ... 1.1 ... 2.0 .... 2.2. In der Hilfe zu WSAStartup wird auf 2.2 eingegangen, allerdings inkludieren die in dem Codebeispiel die winsock2.h. Diese ist auch vorhanden, die ws2.lib habe ich gelinkt, aber wie gesagt, nutze ich die winsock2.h gibt es massig Fehler.
    Weis zufällig jemand Rat? Im Internet habe ich leider nix brauchbares gefunden (google, msdn)
    Gruß Basti



  • hat niemand eine Idee? Welche Alternativen zu WinSock gäbe es denn noch?

    //edit:
    Dieses kleine Progrämmchen läuft ohne Probleme:

    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>
    
    //Prototypen
    int startWinsock(void);
    
    int main()
    {
      long rc;
      SOCKET s;
      SOCKADDR_IN addr;
      char buf[256];
    
      // Winsock starten
      rc=startWinsock();
      if(rc!=0)
      {
        printf("Fehler: startWinsock, fehler code: %d\n",rc);
        return 1;
      }
      else
      {
        printf("Winsock gestartet!\n");
      }
    
      // 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("127.0.0.1"); // zielrechner ist unser eigener
    
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Verbunden mit 127.0.0.1..\n");
      }
    
      // 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);
        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 antwortet: %s\n",buf);
      }
      closesocket(s);
      WSACleanup();
      return 0;
    }
    
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    

    UNd das sind aber die Fehler, wenn ich die winsock2.h und WinSock Version 2.2 nutze:

    --------------------Configuration: Scannerclient - Win32 (WCE ARMV4I) Debug--------------------
    Compiling...
    ScannerclientDlg.cpp
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(113) : error C2011: 'fd_set' : 'struct' type redefinition
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(133) : warning C4005: 'FD_CLR' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(123) : see previous definition of 'FD_CLR'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(148) : warning C4005: 'FD_SET' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(129) : see previous definition of 'FD_SET'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(157) : error C2011: 'timeval' : 'struct' type redefinition
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(183) : warning C4005: 'IOCPARM_MASK' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(164) : see previous definition of 'IOCPARM_MASK'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(190) : warning C4005: '_IO' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(172) : see previous definition of '_IO'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(192) : warning C4005: '_IOR' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(173) : see previous definition of '_IOR'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(194) : warning C4005: '_IOW' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(174) : see previous definition of '_IOW'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(213) : error C2011: 'hostent' : 'struct' type redefinition
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(226) : error C2011: 'netent' : 'struct' type redefinition
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(233) : error C2011: 'servent' : 'struct' type redefinition
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(245) : error C2011: 'protoent' : 'struct' type redefinition
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(262) : warning C4005: 'IPPROTO_GGP' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(239) : see previous definition of 'IPPROTO_GGP'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(331) : error C2011: 'in_addr' : 'struct' type redefinition
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(389) : error C2011: 'sockaddr_in' : 'struct' type redefinition
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(399) : error C2011: 'WSAData' : 'struct' type redefinition
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(459) : warning C4005: 'SO_DONTLINGER' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(437) : see previous definition of 'SO_DONTLINGER'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(516) : warning C4005: 'AF_IPX' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(488) : see previous definition of 'AF_IPX'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(556) : warning C4005: 'AF_MAX' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(505) : see previous definition of 'AF_MAX'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(562) : error C2011: 'sockaddr' : 'struct' type redefinition
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(602) : error C2011: 'sockproto' : 'struct' type redefinition
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(641) : error C2011: 'linger' : 'struct' type redefinition
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(654) : warning C4005: 'SOMAXCONN' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(566) : see previous definition of 'SOMAXCONN'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(679) : warning C4005: 'FD_READ' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(584) : see previous definition of 'FD_READ'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(682) : warning C4005: 'FD_WRITE' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(585) : see previous definition of 'FD_WRITE'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(685) : warning C4005: 'FD_OOB' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(586) : see previous definition of 'FD_OOB'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(688) : warning C4005: 'FD_ACCEPT' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(587) : see previous definition of 'FD_ACCEPT'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(691) : warning C4005: 'FD_CONNECT' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(588) : see previous definition of 'FD_CONNECT'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(694) : warning C4005: 'FD_CLOSE' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(589) : see previous definition of 'FD_CLOSE'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(893) : warning C4005: 'h_errno' : macro redefinition
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock.h(702) : see previous definition of 'h_errno'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(2250) : error C2059: syntax error : '('
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(2268) : warning C4002: too many actual parameters for macro 'WSACleanup'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(2268) : error C2059: syntax error : '('
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(2285) : error C2733: second C linkage of overloaded function 'SetLastError' not allowed
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(2285) : see declaration of 'SetLastError'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(2302) : warning C4002: too many actual parameters for macro 'WSAGetLastError'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(2302) : error C2556: 'int __cdecl GetLastError(void)' : overloaded function differs only by return type from 'unsigned long __cdecl GetLastError(void)'
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winbase.h(1938) : see declaration of 'GetLastError'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(2302) : error C2371: 'GetLastError' : redefinition; different basic types
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winbase.h(1938) : see declaration of 'GetLastError'
    c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(2913) : error C2733: second C linkage of overloaded function 'WSAIoctl' not allowed
            c:\programme\windows ce tools\wce420\datalogic-net\include\armv4i\winsock2.h(2903) : see declaration of 'WSAIoctl'
    C:\Dokumente und Einstellungen\stephan\Eigene Dateien\VC++ SP4\Scannerclient\ScannerclientDlg.cpp(107) : error C2440: '=' : cannot convert from 'unsigned long (__cdecl *)(void)' to 'unsigned long'
            This conversion requires a reinterpret_cast, a C-style cast or function-style cast
    Error executing clarm.exe.
    
    ScannerclientDlg.obj - 19 error(s), 20 warning(s)
    

    😞 😞 😞 😞 😞



  • okay:
    habe das Problem mit der winsock2.h so geklärt, dass ich in der stdafx.h gesehn habe, dass da eine afxsock.h nachgeladen wird. Diese habe ich einfach gegen winsock2.h ausgetauscht, und nun steht auch in meiner HOSTENT Struktur etwas drinne, also he->h_name ist jetzt 0x00032ee4 "RO-EDV-264.wdi-dsw.local"
    Ist das jetzt schon die Netzwerknummer im Netzwerkformat in der Hex-Zahl, oder hat der sich den namen nur als Mitglied der Domäne geholt (hat nur das rausgefunden) ???
    Gruß Basti


Log in to reply