Hallo allen,
ik moest voor school een opdracht maken waarbij een client en een server voorkwamen. Een vereiste hierbij was dat de client en de server beide in een andere taal werden geschreven. Op zich werkt de handel nu prima, de client is in java geschreven, en de server in C++. Er is echter één probleempje (althans, dat vindt de leraar
) De server voert geen andere taken uit zolang hij luistert voor connecties. Hieronder staat de oorspronkelijke code, zoals deze van msdn is gehaald. Bij deze code treedt hetzelfde probleem op.
Het probleem hierbij is, dat als de server voor connecties wacht, het programma blijft 'hangen', de repaintfunctie wordt oa niet meer uitgevoerd. Om het programma af te sluiten, verzendt de client een speciale code, zodat de server ophoudt met luisteren voor connecties. Ik heb het getest, en hij hangt in de accept(). Is er een eenvoudige manier om dit elegant op te lossen, zonder dat ik de hele server op de kop moet gooien?
Ik heb wat gelezen over non blocking e.d., maar dat lijkt mij aardig ingewikkeld, en bovendien werkt dit opzich, afgezien dat hij niet repaint enzo
ik moest voor school een opdracht maken waarbij een client en een server voorkwamen. Een vereiste hierbij was dat de client en de server beide in een andere taal werden geschreven. Op zich werkt de handel nu prima, de client is in java geschreven, en de server in C++. Er is echter één probleempje (althans, dat vindt de leraar
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| void main() {
//----------------------
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n");
//----------------------
// Create a SOCKET for listening for
// incoming connection requests.
SOCKET ListenSocket;
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(27015);
if (bind( ListenSocket,
(SOCKADDR*) &service,
sizeof(service)) == SOCKET_ERROR) {
printf("bind() failed.\n");
closesocket(ListenSocket);
return;
}
//----------------------
// Listen for incoming connection requests.
// on the created socket
if (listen( ListenSocket, 1 ) == SOCKET_ERROR)
printf("Error listening on socket.\n");
//----------------------
// Create a SOCKET for accepting incoming requests.
SOCKET AcceptSocket;
printf("Waiting for client to connect...\n");
//----------------------
// Accept the connection.
while(1) {
AcceptSocket = SOCKET_ERROR;
while( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( ListenSocket, NULL, NULL );
}
printf("Client connected.\n");
ListenSocket = AcceptSocket;
break;
}
// afhandelen connectie...
} |
Het probleem hierbij is, dat als de server voor connecties wacht, het programma blijft 'hangen', de repaintfunctie wordt oa niet meer uitgevoerd. Om het programma af te sluiten, verzendt de client een speciale code, zodat de server ophoudt met luisteren voor connecties. Ik heb het getest, en hij hangt in de accept(). Is er een eenvoudige manier om dit elegant op te lossen, zonder dat ik de hele server op de kop moet gooien?
[ Voor 3% gewijzigd door Verwijderd op 07-06-2006 23:10 ]