ik zit hier met een vreem probleem waar zelfs google geen antwoord op kon vinden.
ik probeer een hele simpele C++ versie te schrijven van een UDP server en client zoals beschreven in 'Beej's Guide to Network Programming'. het mag eigenlijk de naam C++ versie niet dragen omdat het enige wat ik heb toegevoegd is een namespace, een helper functie die wat overloading gebruikt en een log functie die een timestamp toevoegt.
het geheel compileert ook keurig met g++ onder kubuntu 64bit. start ook keurig totdat het de bind systemcall maakt. deze keert gewoon niet terug. geen error, geen waarschuwing. zelfs geen return waarde. ik heb zelfs alle argumenten eerst zelfstandig verwerkt en gecheckt alvorens ze aan de bind() systemcall te geven. ik heb een printf voor en direct na de call geplaast en de eerste printf wordt weergegeven de 2e verschijnt nooit. het is alsof de systemcall nooit terug keert naar userspace.
het programma blocked gewoon netzoals je op een read of accept zou verwachten maar voorzover ik weet blocked een bind call nooit of in iedergeval niet uren lang. hij lukt of hij faalt. mijn programma hangt gewoon. ik kan het alleen beindigen met ctrl+c.
om zeker te zijn dat het niet aan mijn systeem lag heb ik het origineel waar ik mijn C++ versie van heb afgeleid, geschreven in C, ook gecompileerd en hier werkt alles zoals het moet.
wat zie ik over het hoofd? waar zit mijn fout? goede tutorials over UDP server sockets zijn er ook niet echt. en een goed C++ udp server socket tutorial moet ik nog vinden want vrijwel alle tutorials gaan ervan uit dat de C systemcalls gewoon in C++ kunnen worden gebruikt en ik zou ook niet weten waarom niet. nou, in mijn geval niet dus. wie helpt mij op weg?
Link naar Bjee's guide:
http://www.beej.us/guide/...html/multipage/index.html
en de sectie over UDP sockets met de werkende C sourcecode:
http://www.beej.us/guide/...lientserver.html#datagram
en hier de server-sectie van mijn C++ versie in wording:
welke ik compileerde met de command-line als:
g++ -o udpmirror_server udpmirror.cpp udpmirror_server.cpp
wie helpt mij op weg?
ik probeer een hele simpele C++ versie te schrijven van een UDP server en client zoals beschreven in 'Beej's Guide to Network Programming'. het mag eigenlijk de naam C++ versie niet dragen omdat het enige wat ik heb toegevoegd is een namespace, een helper functie die wat overloading gebruikt en een log functie die een timestamp toevoegt.
het geheel compileert ook keurig met g++ onder kubuntu 64bit. start ook keurig totdat het de bind systemcall maakt. deze keert gewoon niet terug. geen error, geen waarschuwing. zelfs geen return waarde. ik heb zelfs alle argumenten eerst zelfstandig verwerkt en gecheckt alvorens ze aan de bind() systemcall te geven. ik heb een printf voor en direct na de call geplaast en de eerste printf wordt weergegeven de 2e verschijnt nooit. het is alsof de systemcall nooit terug keert naar userspace.
het programma blocked gewoon netzoals je op een read of accept zou verwachten maar voorzover ik weet blocked een bind call nooit of in iedergeval niet uren lang. hij lukt of hij faalt. mijn programma hangt gewoon. ik kan het alleen beindigen met ctrl+c.
om zeker te zijn dat het niet aan mijn systeem lag heb ik het origineel waar ik mijn C++ versie van heb afgeleid, geschreven in C, ook gecompileerd en hier werkt alles zoals het moet.
wat zie ik over het hoofd? waar zit mijn fout? goede tutorials over UDP server sockets zijn er ook niet echt. en een goed C++ udp server socket tutorial moet ik nog vinden want vrijwel alle tutorials gaan ervan uit dat de C systemcalls gewoon in C++ kunnen worden gebruikt en ik zou ook niet weten waarom niet. nou, in mijn geval niet dus. wie helpt mij op weg?
Link naar Bjee's guide:
http://www.beej.us/guide/...html/multipage/index.html
en de sectie over UDP sockets met de werkende C sourcecode:
http://www.beej.us/guide/...lientserver.html#datagram
en hier de server-sectie van mijn C++ versie in wording:
C++:
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
| #include <ctime> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include "udpmirror.hpp" bool udpmirror::Server() { LogMsg("Running UDPMirror in server-mode."); int my_fd; int received; int report_len = 100; char report[report_len]; char buf[BUFSIZE]; sockaddr_in my_server_addr; sockaddr_in sender_addr; socklen_t addr_len = sizeof(sender_addr); LogMsg("Opening server socket."); my_fd = socket(PF_INET, SOCK_DGRAM, 0); if(my_fd < 0){ LogMsg("Failed to open server socket."); return false; } LogMsg("Setting-up sockaddr_in structure."); Setup_sockaddr_in("127.0.0.1", 8471, my_server_addr); LogMsg("Binding server socket."); if(bind(my_fd, (struct sockaddr *)&my_server_addr, sizeof my_server_addr) < 0){ LogMsg("Failed to bind server to IP/port number."); return false; } LogMsg("Ready to receive messages."); for(unsigned int i = 0; i < 1; ++i){ received = recvfrom(my_fd, buf, (BUFSIZE - 1), 0, (struct sockaddr *)&sender_addr, &addr_len); if(received < 0){ LogMsg("Failed to receive UDP packet from socket."); }else{ memset(report, '\0', report_len); sprintf(report, "Received packet of %d bytes from %s.", received, inet_ntoa(sender_addr.sin_addr)); LogMsg(report); } } LogMsg("closing socket."); close(my_fd); return true; } bool udpmirror::Setup_sockaddr_in(char ip[], unsigned short int port, sockaddr_in &sockaddr) { return Setup_sockaddr_in(ntohl(inet_addr(ip)), port, sockaddr); } bool udpmirror::Setup_sockaddr_in(unsigned int ip, unsigned short int port, sockaddr_in &sockaddr) { LogMsg("Filling in IP address and port number into sockaddr_in structure."); sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons(port); sockaddr.sin_addr.s_addr = htonl(ip); memset(sockaddr.sin_zero, '\0', sizeof(sockaddr.sin_zero)); return true; } void udpmirror::LogMsg(char msg[]) { clock_t since; since = (clock() / CLOCKS_PER_SEC); printf("\n[%05d] %s", since, msg); } |
welke ik compileerde met de command-line als:
g++ -o udpmirror_server udpmirror.cpp udpmirror_server.cpp
wie helpt mij op weg?