abonnement Unibet Coolblue Bitvavo
pi_124707722
quote:
2s.gif Op vrijdag 29 maart 2013 13:10 schreef Tijn het volgende:

[..]

Ik denk dat je beter eerst goed kan leren hoe de if-statement werkt voordat je met loops aan de gang gaat.

Je zou bijvoorbeeld als oefening een programma kunnen maken dat 3 ingevoerde getallen sorteert van laag naar hoog zonder loops te gebruiken, maar puur met if-statements.
Dat is ook niet zo moeilijk als je sort van de klasse algorithms gebruikt i.c.m. een vector. Dan heb je niet eens een if statement nodig.

[ Bericht 0% gewijzigd door #ANONIEM op 31-03-2013 01:02:02 ]
pi_124708637
quote:
1s.gif Op zondag 31 maart 2013 01:00 schreef robin007bond het volgende:

[..]

Dat is ook niet zo moeilijk als je sort van de klasse algorithms gebruikt i.c.m. een vector. Dan heb je niet eens een if statement nodig.
Als je wilt leren programmeren doe je imo liever wel een paar keer moeilijk. Wordt het belangrijk dat je foutloos en efficient efficiente code genereert, dan gebruik je bestaande libraries terwijl je weet wat die libraries achter de schermen doen (omdat je het zelf al eens hebt gezien).
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
  zondag 31 maart 2013 @ 05:26:20 #203
12221 Tijn
Powered by MS Paint
pi_124710811
quote:
1s.gif Op zondag 31 maart 2013 01:00 schreef robin007bond het volgende:

[..]

Dat is ook niet zo moeilijk als je sort van de klasse algorithms gebruikt i.c.m. een vector. Dan heb je niet eens een if statement nodig.
Het gaat erom dat die jongen moet leren hoe de if-statement werkt, niet dat-ie een programma maakt om 3 getallen te sorteren natuurlijk :')
pi_124763276
quote:
10s.gif Op zondag 31 maart 2013 05:26 schreef Tijn het volgende:

[..]

Het gaat erom dat die jongen moet leren hoe de if-statement werkt, niet dat-ie een programma maakt om 3 getallen te sorteren natuurlijk :')
Punt was meer dat hij het ook zonder if-statements kan doen waardoor hij er alsnog niets van leert.

[ Bericht 0% gewijzigd door #ANONIEM op 01-04-2013 18:35:43 ]
  maandag 1 april 2013 @ 19:20:57 #205
12221 Tijn
Powered by MS Paint
pi_124764776
quote:
9s.gif Op maandag 1 april 2013 18:33 schreef robin007bond het volgende:

[..]

Punt was meer dat hij het ook zonder if-statements kan doen waardoor hij er alsnog niets van leert.
Daarom is de opdracht dat-ie er wel if-statements voor moet gebruiken B-)
pi_124794948
Dat Project Euler is leuk!
pi_124796673
quote:
6s.gif Op dinsdag 2 april 2013 15:50 schreef robin007bond het volgende:
Dat Project Euler is leuk!
Ohja dat deden we ook nog. :P

Ik zit nu te kloten met AES...
  dinsdag 2 april 2013 @ 16:46:45 #208
12221 Tijn
Powered by MS Paint
pi_124797227
quote:
6s.gif Op dinsdag 2 april 2013 15:50 schreef robin007bond het volgende:
Dat Project Euler is leuk!
Ik heb er laatst weer een paar opgelost, ik zit nu bij opgave 46 B-)
pi_124816972
quote:
6s.gif Op dinsdag 2 april 2013 15:50 schreef robin007bond het volgende:
Dat Project Euler is leuk!
Hadden we daar niet ook een topic over?
pi_124823782
quote:
0s.gif Op dinsdag 2 april 2013 23:10 schreef t4rt4rus het volgende:

[..]

Hadden we daar niet ook een topic over?
Ik ben een laatkomer, maar ik heb wat kunnen vinden:

DIG / Project Euler
pi_124834251
quote:
0s.gif Op woensdag 3 april 2013 08:39 schreef robin007bond het volgende:

[..]

Ik ben een laatkomer, maar ik heb wat kunnen vinden:

DIG / Project Euler
Dat is hem.
pi_125802730
Ik zat leuk even screenshots van Plan 9 te kijken. Zag er leuk uit.

Maar toen werd ik verdrietig. Zie screenshot:



void main :'(
  zondag 28 april 2013 @ 16:18:39 #213
189216 netolk
maar dan andersom
pi_125830823
quote:
0s.gif Op zaterdag 27 april 2013 19:16 schreef robin007bond het volgende:
Ik zat leuk even screenshots van Plan 9 te kijken. Zag er leuk uit.

Maar toen werd ik verdrietig. Zie screenshot:

[ afbeelding ]

void main :'(
Dat is idd niet goed nee :'(
word ik ook altijd verdrietig van
Beware of the Raping Zebra's
pi_125835660
void main'ers should die!

hoi :)
pi_125835766
Interessant stukje over de performance-verschillen tussen normale C-arrays en vectors:

http://assoc.tumblr.com/p(...)or-vs-plain-c-arrays
pi_125837289
Het hele nut van Operator Overloading ontgaat me overigens.
pi_125837851
quote:
0s.gif Op zondag 28 april 2013 19:58 schreef robin007bond het volgende:
Het hele nut van Operator Overloading ontgaat me overigens.
Zeer handig juist. Stel je maakt een classe matrix dan kun je vervolgens * overloaden zodat de matrix A * matrix B = matrix C oplevert.
pi_125837996
quote:
7s.gif Op zondag 28 april 2013 20:10 schreef Dale. het volgende:

[..]

Zeer handig juist. Stel je maakt een classe matrix dan kun je vervolgens * overloaden zodat de matrix A * matrix B = matrix C oplevert.
En met grote projecten? Dan moet je helemaal uitzoeken welke classes welke operator overloaden. Voor dat matrix a + matrix b = c kun je ook een aparte methode maken.
pi_125838074
quote:
0s.gif Op zondag 28 april 2013 20:13 schreef robin007bond het volgende:

[..]

En met grote projecten? Dan moet je helemaal uitzoeken welke classes welke operator overloaden. Voor dat matrix a + matrix b = c kun je ook een aparte methode maken.
Dat kun je doen maar dan worden complexe formules niet meer goed zichtbaar in dit geval. En het gene wat je zegt word idd vaak als een van de nadelen genoemd van operater overloading. Goede documentatie kan echter een verschil maken ;)
pi_125838182
quote:
7s.gif Op zondag 28 april 2013 20:16 schreef Dale. het volgende:

[..]

Dat kun je doen maar dan worden complexe formules niet meer goed zichtbaar in dit geval. En het gene wat je zegt word idd vaak als een van de nadelen genoemd van operater overloading. Goede documentatie kan echter een verschil maken ;)
Ik denk dat het voor de formules niet veel uitmaakt. Als je de functies/methoden een goede naam geeft is het duidelijk wat de formules doen.

Die extra documentatie vind ik verspilde uren. Het lijkt zo net eigen werkverschaffing :P
pi_125844818
quote:
0s.gif Op zondag 28 april 2013 19:16 schreef robin007bond het volgende:
Interessant stukje over de performance-verschillen tussen normale C-arrays en vectors:

http://assoc.tumblr.com/p(...)or-vs-plain-c-arrays
Die bottom lines hebben toch een heel groot duh-gehalte, maar het ergste is een van zijn eerste assumpties. Als x een std::vector is van lengte n, dan wijst &(x[0]) zeker wel naar een contiguous blok geheugen van n elementen. Zou hij de initialisatie van de vector buiten de loop halen (d.w.z., een propere buffer aanleggen), dan was er niets aan de hand; C++ en C zijn verschillende talen en daar moet je ook naar programmeren.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
  zondag 28 april 2013 @ 22:47:46 #222
189216 netolk
maar dan andersom
pi_125847251
quote:
0s.gif Op zondag 28 april 2013 20:18 schreef robin007bond het volgende:

[..]

Ik denk dat het voor de formules niet veel uitmaakt. Als je de functies/methoden een goede naam geeft is het duidelijk wat de formules doen.

Die extra documentatie vind ik verspilde uren. Het lijkt zo net eigen werkverschaffing :P
nja, toch is het wel handig als je gewoon A*B=C kan doen en a*B=c of 6*A=B (waar de hoofdletters voor matrices staan en de kleine letters voor vectoren)
Beware of the Raping Zebra's
pi_125851927
quote:
0s.gif Op zondag 28 april 2013 19:16 schreef robin007bond het volgende:
Interessant stukje over de performance-verschillen tussen normale C-arrays en vectors:

http://assoc.tumblr.com/p(...)or-vs-plain-c-arrays
Klopt niks van. Hij zegt dat vector niet continous is, dat is het wel.
En een c array is te vergelijken met een std::array niet vector.

Vector doet dynamic allocation, dat kan je met c arrays niet doen.
pi_125852233
quote:
0s.gif Op zondag 28 april 2013 20:13 schreef robin007bond het volgende:

[..]

En met grote projecten? Dan moet je helemaal uitzoeken welke classes welke operator overloaden. Voor dat matrix a + matrix b = c kun je ook een aparte methode maken.
Andere member functies moet je ook opzoeken...

Als je twee matrices wil optellen is het toch veel makkelijker om A += B; te doen ipv A.add(B);
En A + B; moet dan worden Add(A, B);?
En daar is het dan weer geen member functie...

Wees blij dat er operators zijn... Wil je alles met gewone functies doen?
int *i;
initialize(i, 0);

cout(dereferencei);
etc...
Dat wordt leuk :P
  dinsdag 18 juni 2013 @ 19:22:07 #225
189216 netolk
maar dan andersom
pi_127957876
hey, ik zit met een probleempje

Ik ben bezig om data via icmp te versturen (zoals ping ect.)

nu is het zo dat ik via het programmaatje dat ik gemaakt heb wel data kan versturen alleen niet kan ontvangen (wireshark ziet wel een ping reply terug komen).

nu is dit mijn ontvang code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// The IP header
struct IPHeader {
    char h_len:4;           // Length of the header in dwords
    char version:4;         // Version of IP
    char tos;               // Type of service
    unsigned short total_len;       // Length of the packet in dwords
    unsigned short ident;           // unique identifier
    unsigned short flags;           // Flags
    char ttl;               // Time to live
    char proto;             // Protocol number (TCP, UDP etc)
    unsigned short checksum;        // IP checksum
    unsigned long source_ip;
    unsigned long dest_ip;
};

SOCKET hSocket = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
std::cout << "Receiving... ";
recv_buff = new IPHeader + 1024;
char buff[1024+sizeof(IPHeader)];
int i = recv(hSocket,buff,1024+sizeof(IPHeader),0);
if(i == 0)
    std::cout << "Connection closed\n";
else if(i == SOCKET_ERROR){
    std::cout << "Failed!\n";
    if(WSAGetLastError() == WSAEMSGSIZE)
    std::cout << "Buffer is too small!\n";
    throw Error();
}
else{
    std::cout << "Done.\n";
    std::cout << '\n';
    for(int j = 0; j < i; j++){
    //std::cout << tempbuff[j];
}
Ik weet dat het dus aan dit stukje code moet liggen aangezien wireshark wel een ping reply vind op een request dat ik gemaakt heb
Weet iemand waarom het programmaatje dat pakketje niet onderschept?
Beware of the Raping Zebra's
pi_127960092
1recv_buff = new IPHeader + 1024;
Lijkt me nogal een vreemd stukje code. Wat wil je hier precies mee doen?
  dinsdag 18 juni 2013 @ 23:03:18 #227
189216 netolk
maar dan andersom
pi_127967853
quote:
0s.gif Op dinsdag 18 juni 2013 20:17 schreef thabit het volgende:

[ code verwijderd ]

Lijkt me nogal een vreemd stukje code. Wat wil je hier precies mee doen?
haha, ja dat is het ook :P
maar dat is zodat de buffer groot genoeg is omdat de ping request toevallig 1024 byte is (dat kan idd veel netter)
Beware of the Raping Zebra's
pi_127968114
quote:
0s.gif Op dinsdag 18 juni 2013 23:03 schreef netolk het volgende:

[..]

haha, ja dat is het ook :P
maar dat is zodat de buffer groot genoeg is omdat de ping request toevallig 1024 byte is (dat kan idd veel netter)
En ook een memory leak, want je delete the IPHeader niet.
  woensdag 19 juni 2013 @ 00:09:57 #229
189216 netolk
maar dan andersom
pi_127971068
quote:
0s.gif Op dinsdag 18 juni 2013 23:08 schreef t4rt4rus het volgende:
ory leak
bedankt maar dat word ergens aan het einde van het programma gedaan ;)
heb nu alleen het ontvang stukje staan omdat daar het probleem in moet zitten
maar als de hele code nodig is kan ik die ook best plaatsen hoor (hij is alleen niet zo heel netjes)
Beware of the Raping Zebra's
pi_127971373
quote:
0s.gif Op dinsdag 18 juni 2013 19:22 schreef netolk het volgende:
hey, ik zit met een probleempje

Ik ben bezig om data via icmp te versturen (zoals ping ect.)

nu is het zo dat ik via het programmaatje dat ik gemaakt heb wel data kan versturen alleen niet kan ontvangen (wireshark ziet wel een ping reply terug komen).

nu is dit mijn ontvang code:
[ code verwijderd ]

[ code verwijderd ]

Ik weet dat het dus aan dit stukje code moet liggen aangezien wireshark wel een ping reply vind op een request dat ik gemaakt heb
Weet iemand waarom het programmaatje dat pakketje niet onderschept?
En wat doet je code dan precies? Deadlock?
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
  woensdag 19 juni 2013 @ 00:57:56 #231
189216 netolk
maar dan andersom
pi_127972583
Niet wat ik wil dat het doet iig

het verstuurd nu dus een ping request alleen hij ontvangt de reply niet (terwijl die wel naar mijn pc is verstuurd want via wireshark zie ik die wel gewoon)
dus ergens in de recv code zit iets niet lekker lijkt mij maar ik kan het zo niet vinden
Hoopte eigenlijk dat het heel obvious was en zo opgelost was maar blijkbaar zien jullie het ook niet zo 1,2,3

zal hier mijn hele code wel even droppen:
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
// include ook de lib (D:\IDE\MinGW\lib\libws2_32.a)

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <string>

/* ICMP codes */
#define ICMP_ECHO_REPLY 0
#define ICMP_DEST_UNREACH 3
#define ICMP_TTL_EXPIRE 11
#define ICMP_ECHO_REQUEST 8

class Error{
    
};
struct icmp{
    unsigned char _TYPE;
    unsigned char _CODE;
    unsigned short _CHECKSUM;
};
// The IP header
struct IPHeader {
    char h_len:4;           // Length of the header in dwords
    char version:4;         // Version of IP
    char tos;               // Type of service
    unsigned short total_len;       // Length of the packet in dwords
    unsigned short ident;           // unique identifier
    unsigned short flags;           // Flags
    char ttl;               // Time to live
    char proto;             // Protocol number (TCP, UDP etc)
    unsigned short checksum;        // IP checksum
    unsigned long source_ip;
    unsigned long dest_ip;
};
// ICMP header
struct ICMPHeader {
    char type;          // ICMP packet type
    char code;          // Type sub code
    unsigned short checksum;
    unsigned short id;
    unsigned short seq;
    unsigned long timestamp;    // not part of ICMP, but we need it
};

unsigned short ip_checksum(unsigned short* buffer, int size){
    unsigned long cksum = 0;
    
    // Sum all the words together, adding the final byte if size is odd
    while (size > 1) {
        cksum += *buffer++;
        size -= sizeof(unsigned short);
    }
    if (size) {
        cksum += *(unsigned char*)buffer;
    }

    // Do a little shuffling
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >> 16);
    
    // Return the bitwise complement of the resulting mishmash
    return (unsigned short)(~cksum);
}

unsigned long FindHostIP(const char *pServerName){
    std::cout << "Looking up host... ";
    HOSTENT *pHostent;

    // Get hostent structure for hostname:
    if(!(pHostent = gethostbyname(pServerName))){
        std::cout << "Failed!\n";
        throw Error();
    }
    
    // Extract primary IP address from hostent structure:
    if(pHostent->h_addr_list && pHostent->h_addr_list[0]){
        std::cout << "Done.\n";
        return *reinterpret_cast<unsigned long*>(pHostent->h_addr_list[0]);
    }
    return 0;
}

int main(int argc, char* argv[]){
    WSADATA wsaData;
    unsigned long IP = 0;
    ICMPHeader *send_buff = 0;
    IPHeader *recv_buff = 0;
    
    if(argc == 1){
        std::cout << argv[0] << " [IP adres]\n";
        return 0;
    }
    
    std::cout << "inizializing... ";
    if(WSAStartup(MAKEWORD(2,0),&wsaData)==0){
        if(LOBYTE(wsaData.wVersion) >= 2){
            std::cout << "Done.\n";
            
            /* hier moet de ICMP verbinding gemaakt worden */
            SOCKET hSocket = INVALID_SOCKET;
            
            try{
                std::cout << "Creating socket... ";
                if((hSocket = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP)) == INVALID_SOCKET){
                    std::cout << "Failed!\n";
                    throw Error();
                }
                std::cout << "Done.\n";
                
                sockaddr_in sockAddr;
                sockAddr.sin_family = AF_INET;
                sockAddr.sin_addr.S_un.S_addr = FindHostIP(argv[1]);
                
                std::cout << "Connecting... ";
                if(connect(hSocket,reinterpret_cast<sockaddr*>(&sockAddr),sizeof(sockAddr))!= 0){
                    std::cout << "Failed!\n";
                    throw Error();
                }
                std::cout << "Done.\n";
                
                send_buff = new ICMPHeader;
                send_buff->type = ICMP_ECHO_REQUEST;
                send_buff->code = 0;
                send_buff->checksum = 0; // als 0 dan genereerd zelf
                send_buff->id = (unsigned short)GetCurrentProcessId();
                send_buff->seq = 1; // thread nr???
                send_buff->timestamp = GetTickCount();
                
                send_buff->checksum = ip_checksum((unsigned short*)send_buff,1024+sizeof(ICMPHeader));
                
                std::cout << "Sending... ";
                if(send(hSocket,(char*)send_buff,1024+sizeof(ICMPHeader),0) == SOCKET_ERROR){
                    std::cout << "Failed!\n";
                    throw Error();
                }
                std::cout << "Done.\n";
                
                std::cout << "Receiving... ";
                recv_buff = new IPHeader + 1024;
                char buff[1024+sizeof(IPHeader)];
                int i = recv(hSocket,buff,1024+sizeof(IPHeader),0);
                if(i == 0)
                    std::cout << "Connection closed\n";
                else if(i == SOCKET_ERROR){
                    std::cout << "Failed!\n";
                    if(WSAGetLastError() == WSAEMSGSIZE)
                        std::cout << "Buffer is too small!\n";
                    throw Error();
                }
                else{
                    std::cout << "Done.\n";
                    std::cout << '\n';
                    for(int j = 0; j < i; j++){
                        //std::cout << tempbuff[j];
                    }
                    std::cout << "\n-------------\n";
                }
                
                
            }
            catch(Error){
                
            }
            delete send_buff;
            delete recv_buff;
            
            
        }
        else
            std::cout << "Failed!\n";
    
        std::cout << "Cleaning up winsock... ";
        if(WSACleanup()!=0)
            std::cout << "Failed!\n";
        else
            std::cout << "Done.\n";
    }
    else
        std::cout << "Failed!\n";
    
    return 0;
}
Beware of the Raping Zebra's
pi_127973406
Het probleem is meer dat we geen glazen bol hebben. Een recv blockt totdat hij wat ontvangt. Als je programma niet vastloopt, heeft hij dus wel wat ontvangen; de vraag is dan wat. Als het programma wel vastloopt dan komt het bericht nooit bij de recv aan en is er compleet wat anders aan de hand.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_127975731
quote:
0s.gif Op dinsdag 18 juni 2013 23:03 schreef netolk het volgende:

[..]

haha, ja dat is het ook :P
maar dat is zodat de buffer groot genoeg is omdat de ping request toevallig 1024 byte is (dat kan idd veel netter)
De buffer die gereserveerd wordt is gewoon sizeof(IPHeader) bytes in dat stukje code. Het enige wat + 1024 doet, is 1024*sizeof(IPHeader) (en niet 1024) bytes bij de pointer optellen optellen. Lijkt me dus iets wat in alle opzichten fout is.
  woensdag 19 juni 2013 @ 10:27:16 #234
189216 netolk
maar dan andersom
pi_127978274
quote:
7s.gif Op woensdag 19 juni 2013 01:43 schreef trancethrust het volgende:
Het probleem is meer dat we geen glazen bol hebben. Een recv blockt totdat hij wat ontvangt. Als je programma niet vastloopt, heeft hij dus wel wat ontvangen; de vraag is dan wat. Als het programma wel vastloopt dan komt het bericht nooit bij de recv aan en is er compleet wat anders aan de hand.
hij komt bij het block recv aan alleen vervolgens blijft hij daar "wachten" en doet dan dus niks meer

quote:
0s.gif Op woensdag 19 juni 2013 08:54 schreef thabit het volgende:

[..]

De buffer die gereserveerd wordt is gewoon sizeof(IPHeader) bytes in dat stukje code. Het enige wat + 1024 doet, is 1024*sizeof(IPHeader) (en niet 1024) bytes bij de pointer optellen optellen. Lijkt me dus iets wat in alle opzichten fout is.
ow, dat is idd niet de bedoeling (normaal doe ik het wel eens met een char maar gezien dat die 1 byte is klopt dat sowieso... hoe kan ik hem dan de grote van 1024 bytes + de sizeof(IPHeader) geven? is new char + (1024+sizeof(IPHeader)) daar de enige optie voor? Vind ik er namelijk niet netjes uitzien

EDIT: zie net dat die recv_buff toch niet gebruikt word.
zucht haat aan code die ik niet zelf geschreven heb
Beware of the Raping Zebra's
pi_127978440
quote:
0s.gif Op woensdag 19 juni 2013 10:27 schreef netolk het volgende:

[..]

hij komt bij het block recv aan alleen vervolgens blijft hij daar "wachten" en doet dan dus niks meer
Dat is een deadlock. Die message komt dus nooit aan bij de recv. Ervanuitgaande dat er geen bug zit in die code, moet je echt in de hoek zoeken van een firewall die ICMP/jouw applicatie blokkeert, of het luisteren op de verkeerde poort. Controleren of de socket open is alvorens de recv aan te roepen is ook handig.

quote:
[..]

ow, dat is idd niet de bedoeling (normaal doe ik het wel eens met een char maar gezien dat die 1 byte is klopt dat sowieso... hoe kan ik hem dan de grote van 1024 bytes + de sizeof(IPHeader) geven? is new char + (1024+sizeof(IPHeader)) daar de enige optie voor? Vind ik er namelijk niet netjes uitzien

EDIT: zie net dat die recv_buff toch niet gebruikt word.
zucht haat aan code die ik niet zelf geschreven heb
Precies.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
  woensdag 19 juni 2013 @ 10:34:43 #236
189216 netolk
maar dan andersom
pi_127978507
quote:
2s.gif Op woensdag 19 juni 2013 10:32 schreef trancethrust het volgende:

[..]

Dat is een deadlock. Die message komt dus nooit aan bij de recv. Ervanuitgaande dat er geen bug zit in die code, moet je echt in de hoek zoeken van een firewall die ICMP/jouw applicatie blokkeert, of het luisteren op de verkeerde poort. Controleren of de socket open is alvorens de recv aan te roepen is ook handig.

[..]

Precies.
hmm, ICMP heeft geen poort maar dat terzijde.
Zal idd even een check er voor gooien die checkt of de socket nog wel open is (maar zou recv niet gewoon 0 moeten returnen als de socket niet meer open is?) en anders zal ik eens even kijken of hij het zonder firewall wel doet
Beware of the Raping Zebra's
pi_127978582
quote:
0s.gif Op woensdag 19 juni 2013 10:27 schreef netolk het volgende:

[..]

ow, dat is idd niet de bedoeling (normaal doe ik het wel eens met een char maar gezien dat die 1 byte is klopt dat sowieso... hoe kan ik hem dan de grote van 1024 bytes + de sizeof(IPHeader) geven? is new char + (1024+sizeof(IPHeader)) daar de enige optie voor? Vind ik er namelijk niet netjes uitzien

..
Bovendien maak je hier een denkfout; als iets van de grootte 1024+sizeof(IPHeader) is, dan is het geen IPHeader meer. Je `new char' notatie maakt bovendien precies dezelfde fout; hij alloceert 4 bytes en sprint dan 1024+x bytes ernaast.
Wat je wilt is new char[ 1024+sizeof(IPHeader) ] maar dit is totaal geen C++ meer. Beter maak je een klasse gebaseerd op IPHeader die als eerste veld iets van 1024 heeft, en alloceer je dat gevaarte. Let wel dat het me nog steeds compleet onduidelijk is wat de bedoeling is van die 1024 bytes.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
pi_127978655
quote:
0s.gif Op woensdag 19 juni 2013 10:34 schreef netolk het volgende:

[..]

hmm, ICMP heeft geen poort maar dat terzijde.
OK
quote:
Zal idd even een check er voor gooien die checkt of de socket nog wel open is (maar zou recv niet gewoon 0 moeten returnen als de socket niet meer open is?)
[..]
Volgens mij het gedrag van recv ongedefineerd wanneer het een ongeldige socket wordt gevoerd.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
  woensdag 19 juni 2013 @ 10:56:10 #239
189216 netolk
maar dan andersom
pi_127979215
quote:
2s.gif Op woensdag 19 juni 2013 10:37 schreef trancethrust het volgende:

[..]

Bovendien maak je hier een denkfout; als iets van de grootte 1024+sizeof(IPHeader) is, dan is het geen IPHeader meer. Je `new char' notatie maakt bovendien precies dezelfde fout; hij alloceert 4 bytes en sprint dan 1024+x bytes ernaast.
Wat je wilt is new char[ 1024+sizeof(IPHeader) ] maar dit is totaal geen C++ meer. Beter maak je een klasse gebaseerd op IPHeader die als eerste veld iets van 1024 heeft, en alloceer je dat gevaarte. Let wel dat het me nog steeds compleet onduidelijk is wat de bedoeling is van die 1024 bytes.
goed punt.
Die 1024 bytes is puur als pakket vergroting zodat er wat data verstuurd word. Maar zoals eerder was dat code dat sowieso verder niet gebruikt werd dus dat heb ik er maar gelijk uit gehaald

Net even zonder firewall geprobeerd maar hij blijft in die deathlock uitkomen
Beware of the Raping Zebra's
  woensdag 19 juni 2013 @ 11:51:53 #240
189216 netolk
maar dan andersom
pi_127981473
Oke, ik heb er nu een select voor gezet, dit is nu de receive code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
std::cout << "Receiving... ";
                int result = 0;
                fd_set socks;
                struct timeval t;
                /* Set socket listening descriptors */
                FD_ZERO(&socks);
                FD_SET(hSocket, &socks);
                if((result = select(hSocket + 1, &socks, 0, 0, &t)) < 0){
                    std::cout << "Failed!.\nCould not select socket.\n";
                    throw Error();
                }
                else if(result > 0){
                    char recv_buff[4048];
                    sockaddr_in dst;
                    int dst_addr_len = sizeof(dst);
                    //int Received_bytes = recv(hSocket, (char*)recv_buff,sizeof(recv_buff),0);
                    int Received_bytes = recv(hSocket, recv_buff, sizeof(recv_buff), 0);
                    std::cout << "\nReceived bytes: " << Received_bytes << ".\n";// temp
                }
                else
                    std::cout << "Failed!\nPacket not received.\n";
nu returned select 0, waardoor het als gefaald word beschouwt (maar wireshark zit nog steeds een reply binnen komen)
Beware of the Raping Zebra's
pi_127982383
Moet je je timeout niet zetten? Stel dat de compiler t initialiseert als 0, dan wordt select een poll ipv een wait-to-get-ready.

Wat gebeurt overigens eerst? Een program exit of het binnenkomen van die reply?
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
  woensdag 19 juni 2013 @ 13:24:29 #242
189216 netolk
maar dan andersom
pi_127985155
quote:
5s.gif Op woensdag 19 juni 2013 12:14 schreef trancethrust het volgende:
Moet je je timeout niet zetten? Stel dat de compiler t initialiseert als 0, dan wordt select een poll ipv een wait-to-get-ready.

Wat gebeurt overigens eerst? Een program exit of het binnenkomen van die reply?
die timeout is op 5 sec gezet dat klopt want daarna stopt het programma.
Ondertussen die select er weer uitgesloopt aangezien het niet werkte en volgens mij overbodig is.

overigens ping ik naar de router en heb ik bijna meteen (lees 1ms) een ping reply terug alleen onderschept mijn programma dat niet ;(
Het programma blijft namelijk tot in den treuren wachten op een pakketje
Beware of the Raping Zebra's
pi_127986614
quote:
0s.gif Op woensdag 19 juni 2013 13:24 schreef netolk het volgende:

[..]

die timeout is op 5 sec gezet dat klopt want daarna stopt het programma.
Ondertussen die select er weer uitgesloopt aangezien het niet werkte en volgens mij overbodig is.

overigens ping ik naar de router en heb ik bijna meteen (lees 1ms) een ping reply terug alleen onderschept mijn programma dat niet ;(
Het programma blijft namelijk tot in den treuren wachten op een pakketje
Dus je socket is na 5 seconden nog steeds niet klaar voor ontvangst zoals gedetecteerd door gebruik van select, metgevolg dat je dat detectiemechanisme eruit haalt? Is het niet logischer te onderzoeken waarom je socket nooit klaar is om uitgelezen te worden?
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
  woensdag 19 juni 2013 @ 14:08:45 #244
189216 netolk
maar dan andersom
pi_127987050
quote:
15s.gif Op woensdag 19 juni 2013 13:58 schreef trancethrust het volgende:

[..]

Dus je socket is na 5 seconden nog steeds niet klaar voor ontvangst zoals gedetecteerd door gebruik van select, metgevolg dat je dat detectiemechanisme eruit haalt? Is het niet logischer te onderzoeken waarom je socket nooit klaar is om uitgelezen te worden?
Dat is dus het punt ik kan niks raars vinden waardoor het niet zou moeten werken. Had ooit een http request programma gemaakt en daar werkte de boel wel gewoon (zonder select)
Beware of the Raping Zebra's
pi_127987216
quote:
0s.gif Op woensdag 19 juni 2013 14:08 schreef netolk het volgende:

[..]

Dat is dus het punt ik kan niks raars vinden waardoor het niet zou moeten werken. Had ooit een http request programma gemaakt en daar werkte de boel wel gewoon (zonder select)
Tijdens debuggen moet je de fout proberen te isoleren; select helpt door te detecteren dat het probleem bij de socket zit. Ik zou daaruit verder gaan met isoleren; ligt het aan een firewall / heeft je programma wel rechten om een socket te openen? Is je socket-initialisatie code wel OK?
Bedenk oorzaken en vind methodes om te controleren of je hypothese klopt of niet. Zo ja, zoek verder in die richting, zo nee, vind een nieuwe hypothese. Dat is zo'n beetje de debug-cyclus en ja, dat kan vervelend zijn.
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
  woensdag 19 juni 2013 @ 15:34:04 #246
189216 netolk
maar dan andersom
pi_127990513
quote:
2s.gif Op woensdag 19 juni 2013 14:13 schreef trancethrust het volgende:

[..]

Tijdens debuggen moet je de fout proberen te isoleren; select helpt door te detecteren dat het probleem bij de socket zit. Ik zou daaruit verder gaan met isoleren; ligt het aan een firewall / heeft je programma wel rechten om een socket te openen? Is je socket-initialisatie code wel OK?
Bedenk oorzaken en vind methodes om te controleren of je hypothese klopt of niet. Zo ja, zoek verder in die richting, zo nee, vind een nieuwe hypothese. Dat is zo'n beetje de debug-cyclus en ja, dat kan vervelend zijn.
Ja, ik ken het principe wel.
Heb al zonder firewall geprobeerd, hielp niet.
Ook kan hij gewoon data verzenden dus neem aan dat de initialisatie code ok is want dan zou dat ook niet kunnen.
Maar heb nu een code op internet gevonden van een ping en trace programma ik denk dat ik me daar eens in ga verdiepen om te kijken hoe het daar word aangepakt. (al is het in C denk dat ik er toch nog wel wat uit kan halen)
in ieder geval bedankt voor de hulp
Beware of the Raping Zebra's
pi_127991050
M.i. moet het iets basaals zijn als functies als select en recv misgaan.

quote:
The select function determines the status of one or more sockets, waiting if necessary, to perform synchronous I/O.
Is ICMP synchroon? Ik denk dan meer aan TCP ofzo. Misschien is select helemaal niet van toepassing?

quote:
Connectionless, message-oriented sockets allow sending and receiving of datagrams to and from arbitrary peers using sendto and recvfrom. If such a socket is connected to a specific peer, datagrams can be sent to that peer using send and can be received only from this peer using recv.
Ligt de sleutel dan in het gebruiken van recvfrom ipv recv?
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
  woensdag 19 juni 2013 @ 21:34:09 #248
189216 netolk
maar dan andersom
pi_128006210
quote:
5s.gif Op woensdag 19 juni 2013 15:46 schreef trancethrust het volgende:
M.i. moet het iets basaals zijn als functies als select en recv misgaan.

[..]

Is ICMP synchroon? Ik denk dan meer aan TCP ofzo. Misschien is select helemaal niet van toepassing?

[..]

Ligt de sleutel dan in het gebruiken van recvfrom ipv recv?
Ja, zat ook al te denken dat het recvfrom moet zijn dat is nu ook wat ik gebruik maar tot nu toe nog steeds het zelfde probleem
Zal het eens even opnieuw en wat netter gaan schrijven misschien dat het met behulp van een andere code die ik gevonden heb wil lukken
Beware of the Raping Zebra's
  donderdag 20 juni 2013 @ 00:01:36 #249
189216 netolk
maar dan andersom
pi_128016631
Oke, ik heb het nu aan de praat gekregen.

dit is nu de uiteindelijke code:
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Ik vraag me nu alleen af of ik bij de recvfrom functie de buffer grote niet via een sizeof() kan doen ipv. de 1500 die er nu staat (want ja dat ga je natuurlijk geheid vergeten als je de buffer grote aanpast)
Beware of the Raping Zebra's
pi_128019176
Je kan er een struct van maken als in
1
2
3
struct receive_buffer {
        char buffer[ 1500 ];
};
Een sizeof(receive_buffer) is dan 1500*sizeof(char).

(Overigens is dynamisch alloceren van de receive-buffer via new niet nodig)
More oneness, less categories
Open hearts, no strategies
Decisions based upon faith and not fear
People who live right now and right here
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')