Sockets+Threads
-
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.