2010-11-14 16 views
1

Je rencontre un problème lors de l'obtention du numéro de port de destination dans la fonction WSPSend dans l'exemple LSP fourni avec Microsoft Platform SDK.Obtenir le port de destination dans WSPSend

Voici le code que j'utilise. Comme indiqué ci-dessous, l'instruction if n'est pas entrée. J'ai vérifié cela en utilisant une fonction de débogage.

Je suis en train de reconnaître les paquets HTTP sortants à l'intérieur de cette fonction à l'aide du port de destination 80.

int WSPAPI 
WSPSend(
    SOCKET   s, 
    LPWSABUF  lpBuffers, 
    DWORD   dwBufferCount, 
    LPDWORD   lpNumberOfBytesSent, 
    DWORD   dwFlags, 
    LPWSAOVERLAPPED lpOverlapped,        
    LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine, 
    LPWSATHREADID lpThreadId,         
    LPINT   lpErrno            
    ) 
{ 
    INT     ret = SOCKET_ERROR; 
    SOCK_INFO   *SocketContext = NULL; 
    LPWSAOVERLAPPEDPLUS ProviderOverlapped = NULL; 

    *lpErrno = NO_ERROR; 

    // 
    // Find our provider socket corresponding to this one 
    // 
    SocketContext = FindAndRefSocketContext(s, lpErrno); 
    if (NULL == SocketContext) 
    { 
     dbgprint("WSPSend: FindAndRefSocketContext failed!"); 
     goto cleanup; 
    } 

    // My code starts here!!! 
    SOCKET app = SocketContext->LayeredSocket; 
    struct sockaddr FAR name; 
    int FAR namelen; 
    getpeername(app, &name, &namelen); 
    struct sockaddr_in sin; 
    sin =* (const struct sockaddr_in *) (&name); 
    if(sin.sin_port == htons(80)) 
    { 
     // This code is not executed after sending HTTP packets!! 
    } 
} 

Toute idée?

Répondre

2

Est-ce que getpeername a fonctionné? Votre code doit vérifier le code de retour avant d'utiliser les résultats.

Si aucune erreur ne se produit, le nom d'utilisateur renvoie zéro. Sinon, une valeur de SOCKET_ERROR est renvoyée et un code d'erreur spécifique peut être récupéré en appelant WSAGetLastError.

Cela mis à part, vous devez spécifier namelen être la taille de votre structure de sortie avant de faire cet appel - qui est mon pari pour ce qui est faux ici, puisque namelen n'est pas initialisé. Il est important de lire attentivement le WinSock documentation - Windows est truffé de ces règles d'utilisation de l'API, et vous pourriez perdre beaucoup de temps si vous ne les suivez pas.

Sur appel, le paramètre namelen contient la taille en octets, du tampon de nom . Au retour, le paramètre namelen contient la taille réelle, en octets, du paramètre de nom renvoyé.

+0

J'ai vérifié la valeur de retour du getpeername. Il n'a pas retourné 0! – Khaled

+0

@Khaled - c'est une information utile - définissez 'namelen' comme' sizeof (struct sockaddr) 'et cela devrait fonctionner mieux. –

+0

Merci beaucoup. Cela a fonctionné maintenant. – Khaled