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.
Wo übergeben Sie myev an die asynchrone Verbindungsmethode? – jdweng
@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