Socket server

Status
Niet open voor verdere reacties.

werocom

Gebruiker
Lid geworden
16 apr 2008
Berichten
72
Hallo,

Ik probeer een simpele socket server te schrijven met behulp van een tutorial van microsoft (http://msdn.microsoft.com/en-us/library/bb530742(VS.85).aspx). Ik gebruik Borland Builder 5.5.

Dit is de code:
Code:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#define DEFAULT_PORT "27015"

int main()
{
	WSADATA wsaData;
	int iResult;
	struct addrinfo *result = NULL, *ptr = NULL, hints;
	
	ZeroMemory(&hints, sizeof(hints));
	hints.ai_family = AF_INET;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = IPPROTO_TCP;
	hints.ai_flags = AI_PASSIVE;
	
	iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
	
	if (iResult != 0)
	{
		printf("WSAStartup failed: %d\n", iResult);
		return 1;
	}
	
	return 0;
}

Dit is de output van bcc32 (de compiler):
Code:
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.cpp:
Error E2450 test.cpp 11: Undefined structure 'addrinfo' in function main()
Error E2449 test.cpp 11: Size of 'hints' is unknown or zero in function main()
Error E2450 test.cpp 11: Undefined structure 'addrinfo' in function main()
Error E2450 test.cpp 13: Undefined structure 'addrinfo' in function main()
Error E2109 test.cpp 13: Not an allowed type in function main()
Error E2315 test.cpp 14: 'ai_family' is not a member of 'addrinfo', because the type is not yet defined in function main()
Error E2315 test.cpp 15: 'ai_socktype' is not a member of 'addrinfo', because the type is not yet defined in function main()
Error E2315 test.cpp 16: 'ai_protocol' is not a member of 'addrinfo', because the type is not yet defined in function main()
Error E2315 test.cpp 17: 'ai_flags' is not a member of 'addrinfo', because the type is not yet defined in function main()
Error E2451 test.cpp 17: Undefined symbol 'AI_PASSIVE' in function main()
Warning W8004 test.cpp 28: 'ptr' is assigned a value that is never used in function main()
Warning W8004 test.cpp 28: 'result' is assigned a value that is never used in function main()
*** 10 errors in Compile ***

Als ik vervolgens de code aanpas, dus afwijk van de tutorial van microsoft, krijg ik met de volgende code:
Code:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#define DEFAULT_PORT "27015"
#define struct addrinfo *result = NULL, *ptr = NULL, hints;

int main()
{
	WSADATA wsaData;
	int iResult;
	
	ZeroMemory(&hints, sizeof(hints));
	hints.ai_family = AF_INET;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = IPPROTO_TCP;
	hints.ai_flags = AI_PASSIVE;
	
	iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
	
	if (iResult != 0)
	{
		printf("WSAStartup failed: %d\n", iResult);
		return 1;
	}
	
	return 0;
}

De volgende output:
Code:
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.cpp:
Error E2451 test.cpp 13: Undefined symbol 'hints' in function main()
Error E2109 test.cpp 13: Not an allowed type in function main()
Error E2451 test.cpp 17: Undefined symbol 'AI_PASSIVE' in function main()
*** 3 errors in Compile ***

Heb ik zo de eerste 7 errors goed opgelost? En hoe los ik de laatste 3 op?

Bij voorbaat dank,
Wessel.
 
De compiler waarschuwt je dat addrinfo niet kan vinden. Dus moet jij die ergens gaan zoeken;).

Deze error moet je oplossen met een (paar?) extra includes.. en niet met define.

Succes.
 
Bedankt. Ik ben niet echt ver met c++, maar ben wel beter bekend met andere programmeertalen. Ik dacht dat ik met

Code:
struct addrinfo *result = NULL, *ptr = NULL, hints;

een nieuwe structuur definieerde, en dat addrinfo de naam van de nieuwe structuur is. Hoe kan hij hem dan niet vinden. Of als ik ernaast zit, wat doet de bovenstaande regel code dan wel?
 
Code:
struct addrinfo *result = NULL, *ptr = NULL, hints;

Deze regel betekent dat je 2 pointers (result & ptr) aanmaakt naar struct addrinfo en variable van het type addrinfo. Alleen hoe addrinfo er uit ziet geeft je hier niet op.

Dat staat ergens in andere file en die moet je dus zoeken.

aan je code te zien betaat uit minimaal de volgende variablen.
Code:
 ai_family,ai_socktype, ai_protocol, ai_flags = AI_PASSIVE;[/CODE}

mischien moet je eens een code search doen met google op "struct addrinfo"
 
Ik weet niet of het echt helpt voor het probleem, maar ik heb de laatste tijd ook in C++ sockets lopen programmeren en ik gebruik in plaats van

Code:
struct addrinfo hints;

Code:
struct sockaddr_in hints;

nu heb ik ook niet met de MSDN tutorial gewerkt maar met http://beej.us/guide/bgnet/output/html/multipage/index.html. Het is niet voor Windows geschreven, maar geeft een duidelijk uitleg en een link om het naar Windows te porten.

Hoop hiermee een beetje te kunnen helpen.
 
Bedankt, die tutorial ziet er een stuk beter uit. Ik heb een tijdelijke oplossing in Python geschreven, maar zal nu nog een poging wagen in c++.

@Skinflowers, als ik hints verander in *hints is de foutmelding ook weg, alleen heb ik geen idee meer waar ik mee bezig ben en de tutorial geeft me te weinig uitleg. Ga het nu proberen aan de hand van de tutorial van Neo Angelus, bedankt voor de hulp.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan