我正在开发一个C#,UWP 10解决方案,它使用快速,连续的读/写循环与网络设备进行通信.API提供的StreamSocket似乎工作得很好,直到我意识到存在内存泄漏:Task<uint32>
堆中有一个累积,大约每分钟数百个.
无论我while (true)
在内部使用普通旧循环async Task
,还是使用ActionBlock<T>
TPL Dataflow 自我发布(根据此答案),结果都是相同的.
如果我从套接字中消除读取并专注于写作,我能够进一步隔离问题:无论是使用DataWriter.StoreAsync
方法还是更直接StreamSocket.OutputStream.WriteAsync(IBuffer buffer)
,问题依然存在.此外,添加.AsTask()
到这些没有区别.
即使垃圾收集器运行,它们Task<uint32>
也永远不会从堆中删除.所有这些任务都是完整的(RanToCompletion
),没有任何错误或任何其他属性值,表明"还没有准备好回收".
在这个页面上似乎有一个提示我的问题(从托管到非托管世界的字节数组阻止了内存的释放),但是规定的解决方案看起来非常明显:唯一的方法是编写所有通信逻辑C++/CX.我希望这不是真的; 当然,其他C#开发人员已经成功实现了连续的高速网络通信而没有内存泄漏.当然,微软不会发布一个只在C++/CX中没有内存泄漏的API
编辑
根据要求,一些示例代码.我自己的代码有太多层,但使用此Microsoft示例可以观察到一个更简单的示例.我做了一个简单的修改,在循环中发送1000次以突出显示问题.这是相关代码:
public sealed partial class Scenario3 : Page
{
// some code omitted
private async void SendHello_Click(object sender, RoutedEventArgs e)
{
// some code omitted
StreamSocket socket = //get global object; socket is already connected
DataWriter writer = new …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在C#中为UWP实现一个XMPP客户端,并实现这个我StreamSocket
用于TCP
连接.
问题是,对于握手而言,SASL auth
我需要服务器从客户端"写入和读取"序列,并且没有延迟,我无法读取服务器发送的所有数据; 我想删除延迟部分.
这是我的代码:
// Start handshake
await XmppWrite("<?xml version='1.0'?><stream:stream to='" + serverHostName.Domain + "' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>");
var responseStream = await XmppRead();
SaslPlain saslPlain = new SaslPlain(Username, Password);
responseStream = null;
String xml = null;
while (!saslPlain.IsCompleted && (xml = saslPlain.GetNextXml(responseStream)) != null)
{
await XmppWrite(xml);
responseStream = await XmppRead();
}
if (!saslPlain.IsSuccess) return;
// Request bind
await XmppWrite("<?xml version='1.0'?><stream:stream to='" + serverHostName.Domain + "' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>");
responseStream = await XmppRead(); …
Run Code Online (Sandbox Code Playgroud) NestJS 如何用作 websocket 客户端?我想使用 NestJS 作为客户端连接到远程 websocket 服务器,但我在框架中没有找到有关此实现的任何信息。
这段代码:(https://github.com/stuffmc/Safari-Push-Notifications/blob/master/index.php#L195)
stream_socket_client('ssl://gateway.push.apple.com:2195', $error, $errorString,
60, STREAM_CLIENT_CONNECT, $streamContext);
Run Code Online (Sandbox Code Playgroud)
返回false
,但没有错误。这意味着当我发送到/ v1 / push时,它对于每个设备/令牌都失败:( PHP文档说:
如果errno中返回的值为0,并且函数返回FALSE,则表明该错误发生在connect()调用之前。这很可能是由于初始化套接字时出现问题。
我的代码可以完美地在网站上运行(dev / beta / staging),而现在我正尝试进入生产环境,但现在还没有。
我应该注意的是
$ openssl s_client -connect gateway.push.apple.com:2195 -cert MyC.pem -key myK.pem
Run Code Online (Sandbox Code Playgroud)
完美的作品。我有一个提示,我可以在其中键入字符,键入Enter时,它会退出-与我的dev测试相同。
我也没有任何东西发送给/v1/log
(如在https://devforums.apple.com/thread/203825提到的),所以我对问题在哪里一无所知:(
php ssl client-certificates apple-push-notifications stream-socket-client
我正在尝试调试 PHP 函数stream_socket_client,但我真的不知道如何调试。这是我遇到问题的代码:
$this->socket = @stream_socket_client(
$remote, $errno, $errstr,
$this->request->getConfig('connect_timeout'),
STREAM_CLIENT_CONNECT, $context
);
if (!$this->socket) {
throw new HTTP_Request2_ConnectionException(
"Unable to connect to {$remote}. Error: {$errstr}",
0, $errno
);
}
Run Code Online (Sandbox Code Playgroud)
抛出异常,错误显示“无法连接到 tcp://www.dropbox.com:80。错误:连接超时”。这段代码来自一个非常流行的Wordpress 插件,并且经过了充分的测试。我正在使用的服务器有一些怪癖,例如我可以通过 PHP 上传或删除文件等,所以我想知道是否有任何 PHP 设置可以阻止 stream_socket_client 工作以及如何检查这些设置用于我的服务器。
我完全失望了。我正在连接到 ssl 服务器,并且直接连接运行良好,但是当我尝试添加流上下文以使用代理或袜子 5 时,套接字不会使用它并且无论如何都可以很好地直接连接到这些 ssl:// 服务器,我我通过观察 127.0.0.1 代理服务器日志来检查 - 甚至没有连接尝试。另外,我可以使用socks5:// http代理选项将流包装到socks5服务器中吗?
$ctx = stream_context_create( array(
"http" => array(
"timeout" => 15,
"proxy" => "tcp://127.0.0.1:3128",
"request_fulluri" => TRUE,
),
"ssl" => array(
"SNI_enabled" => FALSE,
)
) );
try
{
$socket = stream_socket_client( "ssl://google.com:443",
$errno, $errstr, 15, STREAM_CLIENT_CONNECT, $ctx );
}
catch ( Exception $e )
{
die( $e->getMessage() );
}
if ( $socket === FALSE )
{
echo "bad socket";
}
fwrite( $socket, "GET /\n" );
echo fread( $socket, …
Run Code Online (Sandbox Code Playgroud) php ×3
c# ×2
ssl ×2
.net ×1
async-await ×1
nestjs ×1
sockets ×1
uwp ×1
websocket ×1
winrt-async ×1