Keine Server-OnAccept-Benachrichtigung, wenn der Client ein zweites Mal verbunden wird

9

Ich habe eine MFC C ++ App geschrieben, in der mein Client-Prozess eine TCP MyCAsyncSocket::Connect zu meinem Server-Prozess macht. Der Serverprozess antwortet mit einem MyCAsyncSocket::OnAccept , der dann wie vorgeschrieben den Detach es den Socket anlegt, erzeugt einen Thread, der Attach es dieses Socket liest, das dann die gesendeten Daten liest. MSDN schreibt vor, dass m_hSocket nach Detach auf NULL festgelegt wird.

Es funktioniert gut, aber nur einmal. Wenn der Client das zweite Mal versucht, Connect an die gleiche Socket-Adresse zu senden, tritt keine OnAccept -Benachrichtigung auf. Hier ist der Servercode:

%Vor%

Versuch 1: In OnAccept nach dem Detach Ich habe versucht, mit Listen zu folgen, aber ich bekomme diesen Listener-Fehler: "WSAENOTSOCK: Der Deskriptor ist kein Socket". Nicht sicher, was das bedeutet.

Versuch 2: Ich habe dann versucht, eine Create vor der Folge Listen zu machen, aber dies verursachte eine assert: ASSERT(m_hSocket == INVALID_SOCKET); was definiert ist als:

%Vor%

Im Prototyp-Code habe ich lediglich den Listener-Socket zerstört und von Grund auf neu erstellt, aber für den Produktionscode ist das nicht akzeptabel, da die ganze Idee von Detach ing und re Attach ing ist, um sicherzustellen, dass Die Abhörfähigkeit des Socket-Threads wird niemals länger als Mikrosekunden unterbrochen.

Weiß jemand, was die richtige Semantik sein sollte, um den Sockel für nachfolgende Connect Ionen vorzubereiten?

    
rtischer8277 12.08.2016, 15:46
quelle

1 Antwort

2

Wenn ich das richtig lese, dann rufst du AsyncSelect (FD_READ | FD_CLOSE) auf dem hoschenden socket an - und ich denke, du willst das wirklich am neu akzeptierten Socket (syncSocket) aufrufen.

Ich erwarte, dass das Aufrufen von AsyncSelect (FD_READ | FD_CLOSE) die FD_ACCEPT-Benachrichtigung auf dem abhörenden Socket löschen kann - damit sichergestellt ist, dass kein OnAccept aufgerufen wird, wenn zukünftige Verbindungen zum abhörenden Socket hergestellt werden.

Weiter - wenn Sie oben m_hSocket = NULL setzen, löschen Sie das Handle des horing Sockets, nicht das des neu akzeptierten Sockets (syncSocket).

Außerdem, wenn ich MSDN richtig lese ( Ссылка ), die detach () Methode selbst NULLS das relevante Handle aus, und Sie müssen dies nicht selbst tun. [noch, ich erwarte, können Sie - da m_hSocket sollte ein privates Mitglied von syncSocket sein]

Ich würde erwarten, dass Ihr OnAccept-Code eher wie folgt aussieht:

%Vor%     
Kevin 20.08.2016, 00:32
quelle

Tags und Links