标签: stream-socket-client

为什么在循环中使用StreamSocket会导致内存泄漏?

我正在开发一个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)

.net c# stream-socket-client async-await winrt-async

10
推荐指数
1
解决办法
644
查看次数

UWP,如何从StreamSocket读取所有数据

我正在尝试在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)

c# stream-socket-client uwp

6
推荐指数
1
解决办法
839
查看次数

将 NestJS 连接到 websocket 服务器

NestJS 如何用作 websocket 客户端?我想使用 NestJS 作为客户端连接到远程 websocket 服务器,但我在框架中没有找到有关此实现的任何信息。

websocket stream-socket-client nestjs

6
推荐指数
2
解决办法
5429
查看次数

stream_socket_client在我的服务器上失败,无法进一步了解该错误

这段代码:(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

5
推荐指数
1
解决办法
1816
查看次数

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 工作以及如何检查这些设置用于我的服务器。

php sockets stream-socket-client

3
推荐指数
1
解决办法
6970
查看次数

PHP SSL stream_socket_client 不会使用创建的 $context

我完全失望了。我正在连接到 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 ssl stream-socket-client

2
推荐指数
1
解决办法
3172
查看次数