Ich mache ein Socket-Programm in C++ mit winsock2
und ich versuche, WSAAccept
zu verwenden, um Verbindungen zu akzeptieren. Ich kopierte das Beispiel ConditionalFunction von MSDN für das lpfnCondition
Argument in WSAAcept, wie unten zu sehen.Programm stürzt ab, wenn Inhalt des Zeigers abgerufen werden soll
SOCKET WSAAccept(
_In_ SOCKET s,
_Out_ struct sockaddr *addr,
_Inout_ LPINT addrlen,
_In_ LPCONDITIONPROC lpfnCondition, //<---------
_In_ DWORD_PTR dwCallbackData
);
jedoch, wenn der Inhalt von lpCallerId
in der ConditionalFunction
wie so WSABUF buffer = *lpCallerData
mein Programm stürzt ab, zuzugreifen versuchen. Ich weiß, dass dies die Ursache des Problems ist, denn wenn ich diese Zeile kommentiere, stürzt mein Programm nicht ab. Ich glaube nicht, dass mein gesamter Code notwendig wäre. Jede Hilfe wäre schön.
EDIT:
CALLBACK ConditionalAccept(LPWSABUF lpCallerId,LPWSABUF lpCallerData,LPQOS lpSQOS,
LPQOS lpGQOS,LPWSABUF lpCalleeId,LPWSABUF lpCalleeData,
GROUP *g,DWORD_PTR dwCallbackData)
{
WSABUF buffer = *lpCallerData;
if (lpSQOS != NULL) {
RtlZeroMemory(lpSQOS, sizeof(QOS));
return CF_ACCEPT;
} else
return CF_REJECT;
}
...
WSAAccept(slisten, (SOCKADDR*)&acceptSock, &Size, &ConditionalAccept, NULL);
Bitte versuchen Sie, ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) zu erstellen, das Sie uns zeigen können. –
Was ist 'lpCallerData'? – immibis
Wenn Sie das MSDN-Dokument zu diesem Parameter lesen können: Die Informationen in diesen Parametern werden zusammen mit der Verbindungsanforderung gesendet. * Wenn keine Anruferkennung oder Anruferdaten verfügbar sind, sind die entsprechenden Parameter NULL *. –