Toon posts:

[c++] Fouten in winsock library

Pagina: 1
Acties:
  • 49 views sinds 30-01-2008

Verwijderd

Topicstarter
Omdat vorige topic ten onrechte was gesloten pak ik hier de draad weer op. Ik heb deze keer een heel simpel c++ programma:

C++:
1
2
3
4
5
6
7
8
#include <string>
#include <winsock.h>
// #include <winsock2.h>

int main()
{
    return 0;
}


Beide includes van winsock hebben direct een foutmelding tot gevolg (compiler: g++ onder cywin/windows XP):
In file included from ../main.cpp:2:
/usr/include/w32api/winsock.h:81:2: warning: #warning "fd_set and associated macros have been defined in sys/types. This can cause runtime problems with W32 sockets"
In file included from ../main.cpp:2:
/usr/include/w32api/winsock.h:479: error: declaration of C function `int gethostname(char*, int)' conflicts with /usr/include/sys/unistd.h:206: error: previous declaration `int gethostname(char*, unsigned int)' here
... en met de Visual Studio 6:
main.cpp
c:\program files\microsoft visual studioold\vc98\include\winsock2.h(99) : error C2011: 'fd_set' : 'struct' type redefinition
c:\program files\microsoft visual studioold\vc98\include\winsock2.h(134) : warning C4005: 'FD_SET' : macro redefinition
c:\program files\microsoft visual studioold\vc98\include\winsock.h(83) : see previous definition of 'FD_SET'
Nu ben ik vrij onbekend met programmeren in c/c++ maar dit is toch gewoon raar?
In het vorige topic werd gesuggereerd:
Een van je andere includes include al winsock.h (zonder 2 dus), waardoor het fout gaat. Oplossing: laat deze include winsock2 gebruiken (weet niet precies hoe), of makkelijker: gebruik zelf ook winsock 1.
In dit geval zou <string> dus <winsock.h> includen. Dat zou fout gaan als ik zelf nog eens winsock2 gebruik, maar het gaat dus ook fout als ik zelf winsock.h (1) gebruik. Daarbij, is het zo dat <string> winsock include? Lijkt mij onwaarschijnlijk.

Een andere antwoord was:
Gewoon alle winsock.h includes wijzigen in winsock2.h, het is backwards compatible. Je moet ze idd niet door mekaar gaan gebruiken want dan krijg je dubbele definities van Berkeley Sockets functionaliteit (zoals de FD_SET macro's idd).
Is het dan zo dat ik zodra ik winsock ga gebruiken, ik eerst in alle standaard bestanden die ik include moet gaan zoeken of die bestanden ook winsock gebruiken en dat moet aanpassen? Ik mag toch verwachten dat deze set libraries (van cygwin of van MS) gewoon werken?

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Het probleem in cygwin is dat in <string> de sys/types.h header wordt geinclude, en daarin staan de FD_SET, FD_CLR, etc macro's voor cygwin's POSIX sockets emulatie, die van de win32 api zijn kennelijk anders. Ik heb het net even geprobeerd en het werkt wel als je eerst winsock.h include en daarna string. In VC++ echter geen enkel probleem, omgedraaide includes of niet.

Stukje comment uit sys/types.h:
code:
1
2
3
4
5
6
7
/* We don't define fd_set and friends if we are compiling POSIX
   source, or if we have included (or may include as indicated
   by __USE_W32_SOCKETS) the W32api winsock[2].h header which
   defines Windows versions of them.   Note that a program which
   includes the W32api winsock[2].h header must know what it is doing;
   it must not call the cygwin32 select function.
*/

[ Voor 39% gewijzigd door Radiant op 06-05-2005 13:08 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op vrijdag 06 mei 2005 @ 12:44:
Omdat vorige topic ten onrechte was gesloten pak ik hier de draad weer op.
Of iets onterecht gesloten is, is niet aan jou om te bepalen. Overtuig de moderator, nme in dit geval, dat je topic onterecht dicht is. Hij zal er in dat geval weinig problemen mee hebben om je topic opnieuw te heropenen.

Het zelf opnieuw openen van een topic na een slotje is not-done. Zie ook Je topic is dicht en het is onterecht? Lees hier!

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Dit topic is gesloten.