在本地机器上运行no_ui是可以登录的,然而尝试使用linux云服务器的时候,运行no_ui会导致下面的情况一直卡住。连接服务器成功,但是一直没有登陆成功or登录失败的log。请问可以从什么方向排查这个问题?
在本地机器上运行no_ui是可以登录的,然而尝试使用linux云服务器的时候,运行no_ui会导致下面的情况一直卡住。连接服务器成功,但是一直没有登陆成功or登录失败的log。请问可以从什么方向排查这个问题?
参考了这个,是一样的问题:
https://www.vnpy.com/forum/topic/32287-ubuntufu-wu-qi-shang-wu-fa-ding-yue-ctpquan-shi-chang-xing-qing-shu-ju
我这边尝试了sudo启动,
sudo /home/ubuntu/anaconda3/envs/vnpy/bin/python run.py
是一样的结果
以及这个是腾讯云服务器,我不确定有没有虚拟机的问题....
和这位也是一样的问题:
https://www.vnpy.com/forum/topic/31989-ubuntu22-04xia-ctpshou-quan-yan-zheng-wu-fa-hui-diao
生产环境和simnow都是一样的
我这边使用c++,还是可以返回错误代码的。因为我不是很明白这个field怎么填写:CThostFtdcReqUserLoginField,最后出现Error64即CTP:客户端未认证。
但是使用vnpy框架,这个错误代码都没有。
我觉得多半是vnpy在获取信息来填写这个表单的时候,获取信息卡住了。
在vnpy_ctp/api/vnctpmd/vnctpmd.cpp 中,我想请问一下下图中例如MacAddress这类变量是怎么获取的?我没有找到对应代码,而在python中调用reqUserLogin所传入的字典只有UserID, Password, BrokerID。还是说这类变量是空值?我用c++发送了md login的请求的时候这些是空值,得到的Error64的返回。
参考这个:https://cloud.tencent.com/developer/article/1479193
我现在知道mac_address等信息是在动态链接库里面的函数获取的,错误代码64我再和期货公司联系
但是问题是为什么vnpy没有这个错误代码直接卡住。。
只是接口调用reqUserLogin里面没传,但是reqUserLogin里面封装了的
可以在vnctptd.cpp的reqUserLogin里面加打印看看是否与你自己调用时候传出去的参数一致
如果是authenticate之后没有收到回调,可以在接口创建一个n变量接收调用reqAuthenticate函数的返回值并打印一下看看返回的是不是0
def authenticate(self) -> None:
"""发起授权验证"""
if self.auth_failed:
return
ctp_req: dict = {
"UserID": self.userid,
"BrokerID": self.brokerid,
"AuthCode": self.auth_code,
"AppID": self.appid
}
self.reqid += 1
print('td发送验证请求', ctp_req)
n = self.reqAuthenticate(ctp_req, self.reqid)
print('td验证结果', n)
这个所得到的n输出是0
我这边用c++可以得到正常的结果
可以参考一下7楼
将vnctptd.cpp中的reqAuthenticate函数改成下面的,然后再自行编译。
int TdApi::reqAuthenticate(const dict &req, int reqid)
{
CThostFtdcReqAuthenticateField myreq = CThostFtdcReqAuthenticateField();
memset(&myreq, 0, sizeof(myreq));
getString(req, "BrokerID", myreq.BrokerID);
getString(req, "UserID", myreq.UserID);
getString(req, "UserProductInfo", myreq.UserProductInfo);
getString(req, "AuthCode", myreq.AuthCode);
getString(req, "AppID", myreq.AppID);
std::ofstream outputFile("/home/ubuntu/workspace/output.txt");
if (!outputFile.is_open()) {
std::cerr << "Failed to open the file for writing." << std::endl;
return 1;
}
outputFile << myreq.BrokerID << std::endl;
outputFile << myreq.UserID << std::endl;
outputFile << myreq.UserProductInfo << std::endl;
outputFile << myreq.AuthCode << std::endl;
outputFile << myreq.AppID << std::endl;
outputFile.close();
int i = this->api->ReqAuthenticate(&myreq, reqid);
return i;
};
检查对应的txt文件,发现传出去的参数是一致的。 通过类似的方式更改回调函数:
void TdApi::OnRspAuthenticate(CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
std::ofstream outputFile("/home/ubuntu/workspace/output.txt");
if (!outputFile.is_open()) {
std::cerr << "Failed to open the file for writing." << std::endl;
return;
}
outputFile << "OnRspAuthenticate!!!" << std::endl;
outputFile.close();
Task task = Task();
task.task_name = ONRSPAUTHENTICATE;
if (pRspAuthenticateField)
{
CThostFtdcRspAuthenticateField *task_data = new CThostFtdcRspAuthenticateField();
*task_data = *pRspAuthenticateField;
task.task_data = task_data;
}
if (pRspInfo)
{
CThostFtdcRspInfoField *task_error = new CThostFtdcRspInfoField();
*task_error = *pRspInfo;
task.task_error = task_error;
}
task.task_id = nRequestID;
task.task_last = bIsLast;
this->task_queue.push(task);
};
会发现没有调用过这个回调函数...
那就是c++里没有收到这个回调
对的,但是我上面用c++直接调用api是没有问题的。不清楚还有哪里可能有问题