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:
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:
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?
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%Tags und Links c++ sockets mfc tcplistener