gpt4 book ai didi

sockets - 套接字连接没有明显的原因被关闭

转载 作者:行者123 更新时间:2023-12-03 12:05:57 25 4
gpt4 key购买 nike

我正在尝试实现Facebook X_FACEBOOK_PLATFORM SASL机制,以便可以将Facebook Chat通过XMPP集成到我的应用程序中。

这是代码:

  var ak = "my app id";
var sk = "access token";
var aps = "my app secret";
using (var client = new TcpClient())
{
client.Connect("chat.facebook.com", 5222);
using (var writer = new StreamWriter(client.GetStream())) using (var reader = new StreamReader(client.GetStream()))
{
// Write for the first time
writer.Write("<stream:stream xmlns=\"jabber:client\" xmlns:stream=\"http://etherx.jabber.org/streams\" version=\"1.0\" to=\"chat.facebook.com\"><auth xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\" mechanism=\"X-FACEBOOK-PLATFORM\" /></stream:stream>");
writer.Flush();
Thread.Sleep(500);
// I am pretty sure following works or at least it's not what causes the error
var challenge = Encoding.UTF8.GetString(Convert.FromBase64String(XElement.Parse(reader.ReadToEnd()).Elements().Last().Value)).Split('&').Select(s => s.Split('=')).ToDictionary(s => s[0], s => s[1]);
var response = new SortedDictionary<string, string>() { { "api_key", ak }, { "call_id", DateTime.Now.Ticks.ToString() }, { "method", challenge["method"] }, { "nonce", challenge["nonce"] }, { "session_key", sk }, { "v", "1.0" } };
var responseString1 = string.Format("{0}{1}", string.Join(string.Empty, response.Select(p => string.Format("{0}={1}", p.Key, p.Value)).ToArray()), aps);
byte[] hashedResponse1 = null;
using (var prov = new MD5CryptoServiceProvider()) hashedResponse1 = prov.ComputeHash(Encoding.UTF8.GetBytes(responseString1));
var builder = new StringBuilder();
foreach (var item in hashedResponse1) builder.Append(item.ToString("x2"));
var responseString2 = Convert.ToBase64String(Encoding.UTF8.GetBytes(string.Format("{0}&sig={1}", string.Join("&", response.Select(p => string.Format("{0}={1}", p.Key, p.Value)).ToArray()), builder.ToString().ToLower()))); ;
// Write for the second time
writer.Write(string.Format("<response xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">{0}</response>", responseString2));
writer.Flush();
Thread.Sleep(500);
MessageBox.Show(reader.ReadToEnd());
}
}

我尽可能地缩短和缩小了代码,因为我认为我的SASL实现(无论它是否有效,我还没有机会对其进行测试)不是导致错误的原因。

我遇到了以下异常:无法从传输连接中读取数据:建立的连接被主机中的软件中止了。
10053
System.Net.Sockets.SocketError.ConnectionAborted

每当我第二次尝试从 client的流中读取时,都会发生这种情况。如您所见,我在这里暂停了一个线程,以便Facebook服务器有足够的时间来回答我,但是我之前使用了异步方法,并且遇到了完全相同的事情,因此我决定先尝试同步。无论如何,实际的SASL机制实现实际上不应引起这种情况,因为如果我不立即尝试进行身份验证,但是我发送请求以查看服务器使用的机制,并在另一轮读写中选择该机制,则失败,但是当我立即发送机制选择XML时,它在我发送的第二秒上都起作用并且失败。

因此得出以下结论:我打开套接字连接,对其进行写入,然后从中读取(第一次读取对同步和异步均起作用),第二次对其进行写入,并尝试第二次对其进行读取,在此始终失败。显然,套接字连接本身就是问题。我尝试使用新的 StreamReader进行二读,但无济于事。这是非常不愉快的,因为我真的很想使用“Received”事件或类似 NetworkStreamSend(string data, Action<string> responseProcessor)实现立面,以便在使用该流时有所放心,而且我已经实现了,但是第二次读取也失败了。

感谢您的建议。

编辑:这是通过NetworkStream的外观的代码。使用这种异步方法时会发生同样的事情,但是几个小时前它起作用了,但是对于第二个响应,返回的字符串与第一个相同。我无法弄清楚在此期间我做了哪些更改以及如何更改。
public void Send(XElement fragment)
{
if (Sent != null) Sent(this, new XmppEventArgs(fragment));
byte[] buffer = new byte[1024];
AsyncCallback callback = null;
callback = (a) =>
{
var available = NetworkStream.EndRead(a);
if (available > 0)
{
StringBuilder.Append(Encoding.UTF8.GetString(buffer, 0, available));
NetworkStream.BeginRead(buffer, 0, buffer.Length, callback, buffer);
}
else
{
var args = new XmppEventArgs(XElement.Parse(StringBuilder.ToString()));
if (Received != null) Received(this, args);
StringBuilder = new StringBuilder();
// NetworkStream.BeginRead(buffer, 0, buffer.Length, callback, buffer);
}
};
NetworkStream.BeginRead(buffer, 0, buffer.Length, callback, buffer);
NetworkStreamWriter.Write(fragment);
NetworkStreamWriter.Flush();
}

最佳答案

reader.ReadToEnd()调用会消耗所有内容,直到流结束(即,直到TCP连接关闭)为止。

关于sockets - 套接字连接没有明显的原因被关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11818690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com