Sockets+Threads
-
Hier ein Auszug der Console des Servers
Der AcceptThread hat die ID 800 auf dem Socket 1896
Dann liefert das Accept den Socket 1784 und startet
den Thread 2044.In Zeile 21 und 22 ist Thread 2044 dabei den Socket 1896 zu benutzen
01 Accept: 1896 vvvvvvvvvvvvvvvvvvvv tid: 800 02 ** Hier wurde eine Verbindung aufgebaut – neuer Socket+Thread ** 03 Read: Socket: 1784 END select tid: 2044 04 Read: Socket: 1784 Socket.cpp:407 tid: 2044 05 Accept: 1896 -------------------- tid: 800 06 Accept: 1896 ^^^^^^^^^^^^^^^^^^^^ tid: 800 07 Accept: Socket: 1896 Socket.cpp:218 tid: 800 08 Accept: 1896 vvvvvvvvvvvvvvvvvvvv tid: 800 09 Read: Socket: 1784 END select tid: 2044 10 Read: Socket: 1784 Socket.cpp:407 tid: 2044 11 Accept: 1896 -------------------- tid: 800 12 Accept: 1896 ^^^^^^^^^^^^^^^^^^^^ tid: 800 13 Accept: Socket: 1896 Socket.cpp:218 tid: 800 14 Accept: 1896 vvvvvvvvvvvvvvvvvvvv tid: 800 15 Read: Socket: 1784 END select tid: 2044 16 Read: Socket: 1784 BEG read tid: 2044 17 Read: Socket: 1784 END read tid: 2044 18 ** Hier wurde der Socket geschlossen und Recv gibt 0 zurück ** 19 Read: Socket: 1784 BEG release tid: 2044 20 release Socket: 1784 Socket.cpp:543 tid: 2044 21 Accept: Socket: 1896 Socket.cpp:218 tid: 2044 22 Accept: 1896 vvvvvvvvvvvvvvvvvvvv tid: 2044 23 Accept: 1896 -------------------- tid: 800 24 Accept: 1896 ^^^^^^^^^^^^^^^^^^^^ tid: 800 25 Accept: Socket: 1896 Socket.cpp:218 tid: 800 26 Accept: 1896 vvvvvvvvvvvvvvvvvvvv tid: 800
-
vvvvvvvvvvvvvvvvvv Kommt vor dem Select()
------------------ Kommt vor dem Accept() / Read()
^^^^^^^^^^^^^^^^^^ Kommt nach dem Accept() / Read()
-
Wie gibst Du denn diese Zeile aus? Woher hast Du die ThreadId?
-
cout << "Text" << socket << " tid: " << GetCurrentThreadId() << endl;
-
Dann verwendest Du in Deinem Worker-Thread einen falschen Socket...
-
Okay.. was sagt dir das?
-
wie meinst du denn das?
-
Du hast ein Fehler in Deinem Code!?
-
Da geh ich auch mal von aus, dass ich ein Fehler in meinem Code habe.
Aber ich komm nicht drauf welchen. Dieses Verhalten macht für mich kein Sinn.An der Thread-Sicherheit liegt es also nicht - meinst du.
Der Socket kann auch nicht falsch sein. Ist ja nur ein Integer/Long/FileDescriptor und es geht ja auch alles, bis ich den Client schließe.
Was mich verwundert, ist dass alles prima funktioniert, wenn ich das select() vor dem accept() weg lasse und accept() voll blockiert.
-
struct timeval m_timeout; struct sockaddr_in new_socket_m_addr; memset( &new_socket_m_addr, 0, sizeof( new_socket_m_addr ) ); socklen_t addrlen = sizeof( new_socket_m_addr ); m_timeout.tv_sec = 2; m_timeout.tv_usec = 0; while( true ){ fd_set readfds; FD_ZERO(&readfds); FD_SET(m_sock, &readfds); int ret = 0; ret = select( 0, &readfds, 0, 0, &m_timeout ); if( ret > 0 ){ newSock_sock = accept( m_sock, (struct sockaddr*)&new_socket_m_addr, &addrlen ); return newSock_sock; } }
-
Fang noch mal bei 0 an. Und dann ganz langsam, Schritt für Schritt, voranarbeiten.