2017-01-07 2 views
1

Ich möchte eine Verbindung zu einem Dienst herstellen, der Socket verwendet. Wenn ich Socket.Connect verwende, ist die Antwort 200 OK und ich kann die Daten erfolgreich empfangen, aber wenn ich Socket.ConnectAsync verwende, lautet die Antwort 400 ungültige Anforderung. HierSocket.ConnectAsync empfängt 400 ungültige Anforderung, während Socket.Connect 200 OK erhält

ist der Code für Socket.connect:

SocketAsyncEventArgs myev; 
private void Receive(SocketAsyncEventArgs e) 
{ 
    myev = e; 
    SocketAsyncEventArgs readEventArgs = m_readWritePool.Pop(); 
    readEventArgs.RemoteEndPoint = remote; 
    Socket connectSocket; 
    connectSocket = new Socket(remote.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
    connectSocket.Connect(remote);//Sync Connect 
    ProcessConnect(readEventArgs); 
} 
private void ProcessConnect(SocketAsyncEventArgs e) 
{ 
    AsyncUserToken token = (AsyncUserToken)myev.UserToken; 
    if (myev.BytesTransferred > 0 && myev.SocketError == SocketError.Success) 
    { 
     e.SetBuffer(myev.Offset, myev.BytesTransferred); 
     bool willRaiseEvent = ((AsyncUserToken)e.UserToken).Socket.SendAsync(e); 
     if (!willRaiseEvent) 
     { 
      ProcessServerSend(e); 
     } 
    } 
    else 
    { 
     CloseClientSocket(e); 
    } 
} 

und hier ist der Code für Socket.ConnectAsync:

SocketAsyncEventArgs myev; 
private void Receive(SocketAsyncEventArgs e) 
{ 
    myev = e; 
    SocketAsyncEventArgs readEventArgs = m_readWritePool.Pop(); 
    readEventArgs.RemoteEndPoint = remote; 
    Socket connectSocket; 
    connectSocket = new Socket(remote.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
    ((AsyncUserToken)readEventArgs.UserToken).Socket = connectSocket; 
    bool willRaiseEvent = connectSocket.ConnectAsync(readEventArgs);//Async Connect 
    if (!willRaiseEvent) 
    { 
     ProcessConnect(readEventArgs); 
    } 

} 
private void ProcessConnect(SocketAsyncEventArgs e) 
{ 
    AsyncUserToken token = (AsyncUserToken)myev.UserToken; 
    if (myev.BytesTransferred > 0 && myev.SocketError == SocketError.Success) 
    { 
     e.SetBuffer(myev.Offset, myev.BytesTransferred); 
     bool willRaiseEvent = ((AsyncUserToken)e.UserToken).Socket.SendAsync(e); 
     if (!willRaiseEvent) 
     { 
      ProcessServerSend(e); 
     } 
    } 
    else 
    { 
     CloseClientSocket(e); 
    } 
} 

Bitte beachte, dass wir definiert haben m_readWritePool als SocketAsyncEventArgsPool m_readWritePool; und füllte es mit 1000 Artikel.

private void ProcessServerSend(SocketAsyncEventArgs e) 
{ 
    if (e.SocketError == SocketError.Success) 
    {     
     AsyncUserToken token = (AsyncUserToken)e.UserToken; 
     SocketAsyncEventArgs readEventArgs = m_readWritePool.Pop(); 
     ((AsyncUserToken)readEventArgs.UserToken).Socket = token.Socket;   
     bool willRaiseEvent = token.Socket.ReceiveAsync(readEventArgs); 
     if (!willRaiseEvent) 
     { 
      ProcessServerReceive(readEventArgs); 
     } 
    } 
    else 
    { 
     CloseServerSocket(e); 
    } 
} 

Und ProcessServerReceive ist als:

private void ProcessServerReceive(SocketAsyncEventArgs e) 
{     
    AsyncUserToken token = (AsyncUserToken)myev.UserToken; 
    if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success) 
    { 
     myev.SetBuffer(e.Offset, e.BytesTransferred); 
     byte[] buf = new byte[e.BytesTransferred]; 
     for (int i = 0; i < e.BytesTransferred; i++) 
     { 
      buf[i] = e.Buffer[e.Offset + i]; 
     } 
     string message = Encoding.UTF8.GetString(buf); 
     //The message contains '200 ok' or '400 bad request' when using Connect or ConnectAsync respectively. 
     bool willRaiseEvent = token.Socket.SendAsync(myev); 
     if (!willRaiseEvent) 
     { 
      ProcessSend(myev); 
     } 
    } 
    else 
    { 
     CloseServerSocket(e); 
    } 
} 

Beachten Sie, dass alle Funktionen sind die gleichen, aber die Methode connect

Wir ProcessServerSend wie definiert haben! Ich habe überprüft, dass die gesendete Nachricht dieselbe ist!


Update:

Die Antwort ist:

Bad Request - Ungültiger Verb

HTTP Error 400. Die Anforderung Verb ungültig ist.

+0

Wo übergeben Sie myev an die asynchrone Verbindungsmethode? – jdweng

+0

@jdweng eigentlich verwende ich diesen Code, um Daten von einem Socket A zu erhalten und es an einen anderen Socket B zu senden und die Antwort von B zu empfangen und es an A zurückzusenden. 'Myev' ist ein' SocketAsyncEventArgs', der für den Empfang bestimmt ist Daten von A, also zum Verbinden mit BI haben eine neue definiert. – Alex

Antwort

1

Der Grund für dieses Problem liegt in der Verbindung mit einer SocketAsyncEventArgs Variablen mit einem Puffer von 1024 Elementen initialisiert (1024 Element leeren Puffer). Ich habe das Problem gelöst, indem ich diese Codezeile hinzufüge: readEventArgs.SetBuffer(0, 0); vor Async Connect, die einen Nulllängenpuffer einstellt. Also, meine Receive Funktion wurde geändert in:

private void Receive(SocketAsyncEventArgs e) 
{ 
    myev = e; 
    SocketAsyncEventArgs readEventArgs = m_readWritePool.Pop(); 
    readEventArgs.RemoteEndPoint = remote; 
    Socket connectSocket; 
    connectSocket = new Socket(remote.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
    ((AsyncUserToken)readEventArgs.UserToken).Socket = connectSocket; 
    readEventArgs.SetBuffer(0, 0);//This line of code resolves my issue. 
    bool willRaiseEvent = connectSocket.ConnectAsync(readEventArgs);//Async Connect 
    if (!willRaiseEvent) 
    { 
     ProcessConnect(readEventArgs); 
    } 
} 
Verwandte Themen