我写了一个 python 客户端脚本来通过 tcp 向服务器发送消息。
import socket
TCP_IP = '127.0.0.1'
TCP_PORT = 12003
BUFFER_SIZE = 1024
MESSAGE = b"Hello, World!"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()
print "received data:", data
服务器可以接收到我的数据,但似乎无法读取数据。日志信息复制如下。
I0328 21:45:24.493249 505 prset04.cpp:210] reading the message (3472609771221168177 bytes)
E0328 21:45:25.493088 505 prset04.cpp:162] unable to receive on socket
I0328 21:45:25.493285 505 prset04.cpp:215] echoing the message
E0328 21:45:25.493479 505 prset04.cpp:185] unable to send on socket
我认为 C++ 套接字模块和 Python 之间可能存在一些不同之处。但我不知道那里出了什么问题,因为我不熟悉 C++ 和套接字。
任何想法或解释都会非常有帮助!
谢谢
服务器代码:
static void OnClient(const int sk) {
size_t len;
char buf[1024];
// Read the message length.
if (!ReadBytes(sk, reinterpret_cast<char*>(&len), sizeof(len))) {
LOG(ERROR) << "unable to read message length";
return;
}
LOG(INFO) << "reading the message (" << len << " bytes" << ")";
// Read the message.
ReadBytes(sk, buf, len);
LOG(INFO) << "echoing the message";
// Echo the message.
WriteBytes(sk, buf, len);
}
static bool ReadBytes(const int sk, char* buf, const size_t n) {
char* ptr = buf;
while (ptr < buf + n) {
if (!SetReadTimeout(sk)) {
return false;
}
auto ret = recv(sk, ptr, ptr - buf + n, 0);
if (ret <= 0) {
LOG(ERROR) << "unable to receive on socket";
return false;
}
ptr += ret;
}
return true;
}
最佳答案
正如 Galik 所说,Python 不会像您的程序所期望的那样在字符串之前发送字符串的长度。 C/C++ 也不会这样做。
如果您希望您的 Python 程序与您的 C 程序一起工作,您必须考虑几件事情:
struct 模块将您的字符串打包成所需的长度size_t这样的声明依赖于体系结构,并且在 64 位和 32 位体系结构之间有所不同。您可以使用固定大小的整数,例如 uint32_t如果您希望它们在架构之间兼容。示例代码:
from struct import pack
message = "Hello World"
data = pack('!i%ds' % len(message), len(message), message))
如果您不能更改 C 代码以使用网络字节顺序,您的具体代码应如下所示:
from struct import pack
message = "Hello World"
data = pack('<Q%ds' % len(message), len(message), message))
< = 使用小端字节顺序
Q = 使用无符号 64 位整数(在 64 位架构上为 sizet_t)
关于python - C++ 服务器无法通过套接字从 python 客户端读取我的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29332973/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru