小编Joh*_*ica的帖子

无法检测到C++同步boost :: asio :: ip :: tcp :: socket连接被关闭

boost::asio用来与同一台计算机上运行的node.js TCP服务器应用程序建立同步TCP套接字连接.我在Windows上使用Embarcadero RAD studio XE4构建64位应用程序,该应用程序使用Embarcadero集成升级版本1.50.

除了node.js TCP服务器关闭之外,工作正常.发生这种情况时,我从套接字读取时,我的C++客户端应用程序没有检测到断开连接.但是,当我写入套接字时,它确实检测到断开连接.

我目前的代码是在尝试了解增强文档和SO上的各种答案之后编写的.代码的读取部分如下(我省略了检查紧凑性的错误代码)

boost::system::error_code ec;
boost::asio::io_service io_service;
boost::asio::ip::tcp::socket s(io_service);
boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"),m_port);

ec = s.connect(ep,ec);
std::size_t bytes_available = s.available(ec);
std::vector<unsigned char> data(bytes_available,0);

size_t read_len = boost::asio::read(s,  boost::asio::buffer(data),boost::asio::transfer_at_least(bytes_available),ec);

if ((boost::asio::error::eof == ec) || (boost::asio::error::connection_reset == ec))
{
    // disconnection
    break;
}
Run Code Online (Sandbox Code Playgroud)

这不是一个很好的系统,因为它在循环内部运行自己的线程并不断轮询数据直到程序关闭.通常情况下,read()当没有数据时我不会在套接字上执行,但在这种情况下我会这样做,因为所有文档都让我相信只有在执行读取或写入套接字时才会检测到套接字断开连接.问题是上面的代码在node.js应用程序关闭时根本不会检测到断开连接.如果我正在编写,我会检测到它(代码的写入部分使用与读取相同的boost :: asio :: error`错误),但在读取时却没有.

显然,我无法执行大于可用字节数量的读取,或者我的线程将阻塞,我将无法在我的线程循环中执行写入.

我错过了另一个特定的增强错误代码来检测错误情况吗?或者这是一个特别是零长度读取的问题.如果是这样的话,我还有其他选择吗?

目前我正在让node.js服务器在关闭时关闭我检测到然后自己关闭客户端的时候写入特定的消息.但是,这有点像黑客,如果可能的话,我更愿意采用干净的方法来检测断开连接.

c++ sockets c++builder boost-asio c++builder-xe4

0
推荐指数
1
解决办法
1830
查看次数

不明显的Delphi语法错误

我有一些简单的代码问题我根本无法解决.我正在使用Delphi 5并应用了所有更新.

我有这个代码块:

procedure TForm1.LoadBtnClick(Sender: TObject);
var
   s1, s2, s3 : Textfile;
   sa, sb, RString, SQLString : string;
begin
  with sourcequery do begin
     Close;
     SQL.Clear;
     SQL.Add('delete * from source');
     ExecSQL;
     Close;
     AssignFile(S2, 'c:\delphi programs\events\source1.txt');
     AssignFile(S1, 'c:\delphi programs\events\source2.txt');
     Reset(s2);
     Reset(s1);
     while not eof(s1) do begin
        readln(s1, RString);
        SQLString := 'insert into source1(f1, f2) values(';
        SQLstring := SQLString+ QuotedStr(copy(Rstring, 1, pos(chr(9), Rstring)-1))+', ';
        SQLString := SQLString+QuotedStr(copy(Rstring, pos(chr(9),Rstring)+1,length(Rstring)))+')';
        with sourcequery do begin
           close;
           SQL.Clear;
           SQL.Add(SQLString);
           ExecSQL;
        end;
     end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

但是当我尝试编译它时,它会在"eof("之后停止:

 while not …
Run Code Online (Sandbox Code Playgroud)

delphi text-files

0
推荐指数
1
解决办法
287
查看次数

从Delphi中的不同线程更新TStringGrid

是否可以使用表的每列的线程更新TStringGrid?

我正在每个线程中进行一些计算,我想将它们添加到一个列中,到目前为止我有类似但有一个奇怪的错误.

在一个线程获得其列中当前行的结果后,它将调用此过程.

procedure TAnimator.Iteration(Sender: TObject);
begin
  TMyClass.AddData(TEngine(Sender).Data, TEngine(Sender).ID, TEngine(Sender).IterationsCount);
end;
Run Code Online (Sandbox Code Playgroud)

有时我得到一个表,其中包含正确添加的线程中的所有数据.但是,我可能会得到一个表,其中某些列中的第一个值未正确显示.

|| Col  1 || Col  2 || Col  3 || Col  4 ||
||    1   ||        ||        ||    4   ||
||    1   ||    2   ||        ||    4   ||
||    1   ||    2   ||    3   ||    4   ||
||    1   ||    2   ||    3   ||    4   ||
||    1   ||    2   ||    3   ||    4   || 
Run Code Online (Sandbox Code Playgroud)

delphi multithreading

0
推荐指数
1
解决办法
611
查看次数

在对象中重新获得Classed TObjectList

我创建了一个名为TRecord的类来存储数据.我创建了另一个包含TRecord类作为对象列表的类.我使用TRecord在对象列表中添加记录,然后在完成后将其设置为父类TTableStore.FManyrecords.

我可以检索列表,COUNT显示相同数量的记录,但它不会让我检索每个单独的记录.

问题是我无法访问记录程序/方法甚至定义记录的检索.查看最后一行伪代码:

TRecord = class(TObject)
  private
    FDescription : Variant;
    FDirectDeposit : Double;
  public
    function  GetDescription : Variant;
    function  GetDirectDeposit : Double;
    procedure SetDescription(Value: Variant; DoValidation: Boolean = True);
    procedure SetDirect(Value: Double; DoValidation: Boolean = True);
end;

TTableStore = class(TObject)
  private
    FManyRecords : TObjectList ;
    FTitle2 : Variant;
    FNormalEarn : Double;
  public
    function  GetTitle2 : String;
    function  GetNormalEarn : Double;
    function GetManyRecords: TObjectList;
    procedure SetManyRecords(Value: TObjectList; DoValidation: Boolean = True);
    procedure SetTitle2(Value: String; DoValidation: Boolean = True);
    procedure SetNormalEarn(Value: Double; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe2

0
推荐指数
1
解决办法
504
查看次数

为什么这个数组初始值设定项会抛出NullPointerException?

我目前正在研究Java,我想知道为什么这段代码会在下面指出的行引发NullPointerException.Question对象是一个用户定义的类,在初始化对象时将两个字符串作为参数.

public class QuizTime
{
    public static void main (String[] args)
    {
            Quiz qz = new Quiz();

            // Throws a NullPointerException
            qz.add (new Question ("How may US states are there?", "50"));
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是支持班级.NullPointerException也表示"quiz [count] = q;"行的问题.

import java.util.Scanner;

public class Quiz
{   
    private Question[] quiz;
    private int count;
    private final int MAX_QUESTIONS = 25;

    public void Quiz ()
    {
            quiz = new Question[MAX_QUESTIONS];
            count = 0;
    }

    public void add (Question q)
    {
            if (count < MAX_QUESTIONS)
            {
                    // …
Run Code Online (Sandbox Code Playgroud)

java arrays nullpointerexception

0
推荐指数
1
解决办法
59
查看次数

O(n) 和 O(1 + n) 之间的实际区别?

O(n) 不是对 O(1 + n) 的改进吗?

这是我对差异的看法:

在):

for i=0 to n do ; print i ;
Run Code Online (Sandbox Code Playgroud)

O(1 + n):

a = 1;
for i=0 to n do ; print i+a ;
Run Code Online (Sandbox Code Playgroud)

...这只会减少到 O(n) 对吗?

如果目标时间复杂度是 O(1 + n),但我有一个 O(n) 的解决方案,这是否意味着我做错了什么?

谢谢。

big-o time-complexity

0
推荐指数
1
解决办法
857
查看次数

Celery worker的日志包含问号(???)而不是正确的unicode字符

我在CentOS 6.5上使用Celery 3.1.18和Python 2.7.8.

在Celery任务模块中,我有以下代码:

# someapp/tasks.py
from celery import shared_task
from celery.utils.log import get_task_logger

logger = get_task_logger(__name__)


@shared_task()
def foo():
    logger.info('Test output: %s', u"???")
Run Code Online (Sandbox Code Playgroud)

在这里使用initd脚本来运行Celery worker.我还将以下设置放入/etc/default/celeryd:

CELERYD_NODES="bar"

# %N will be replaced with the first part of the nodename.
CELERYD_LOG_FILE="/var/log/celery/%N.log"

# Workers should run as an unprivileged user.
#   You need to create this user manually (or you can choose
#   a user/group combination that already exists, e.g. nobody).
CELERYD_USER="nobody"
CELERYD_GROUP="nobody"
Run Code Online (Sandbox Code Playgroud)

所以我的日志文件位于/var/log/celery/bar.log …

python unicode logging celery

0
推荐指数
1
解决办法
890
查看次数

ctrl + shift + B有什么作用?

当我按ctrl+ shift+ B.在Delphi XE7(安装了CN_Pack)中,我看到以下内容:

在此输入图像描述

当我再次按ctrl+ shift+ B>^消失.这是什么意思?

根据Delphi文档:

ctrl+ shift+ B 显示缓冲区列表.

这是其他的东西,它是什么?

ide delphi keyboard-shortcuts delphi-xe7

0
推荐指数
1
解决办法
421
查看次数

表格上有四个标准单选按钮.如何使第一对独立于第二对工作

表格上有四个标准单选按钮.如何使第一对独立于第二对工作

将它们链接到事件是最好的方法吗?

delphi radio-button

0
推荐指数
1
解决办法
204
查看次数

为什么关闭我的地址计算?

为什么两条箭头线的地址不同?

我在.exe文件中的机器代码中插入蓝线,并期望在ADD指令之后将其与AND相同的地址中的值,但显然AND根据反汇编程序在不同的地址中占用.

在此输入图像描述

我想到它可能是因为地址偏移但是C5 - BE = 7而F8 - EF = 9因此偏移量甚至不匹配,我不知道地址转换之间发生了什么; 如何0x0193A4EF在机器代码中给出的地址计算出来0x0131132A

x86 assembly

0
推荐指数
1
解决办法
66
查看次数