繁体   English   中英

套接字无法接收数据? 客户端是使用Boost.asyio库编写的。 服务器是用python编写的

[英]Socket cannot receive data? Client is written using Boost.asyio library. Server is written in python

客户代码

#include <cstdlib>
#include <iostream>
#include <memory>
#include <utility>
#include <boost/asio.hpp>
#include <string>
#include <boost/array.hpp>

using namespace std;
using namespace boost::asio;

int main(int argc, char* argv[])
{

    io_service service;
    ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1"), 2001);

    ip::tcp::socket sock(service);
    sock.connect(ep);

    boost::asio::streambuf sb;
    boost::system::error_code ec;
    size_t len;
    while (true)
    {
        //write data
        sock.write_some(buffer("ok", 2));
        //read data
        read(sock, sb, transfer_all(),ec);
        //handle error
        if (ec && ec != error::eof) {
            std::cout << "receive failed: " << ec.message() << std::endl;
        }
        else {
            const char* data = buffer_cast<const char*>(sb.data());
            std::cout << data << std::endl;
        }
    }
    return 0;
}

服务器代码

import socket
import threading

s = socket.socket()
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(("127.0.0.1",2001))

s.listen(5)
cons = []

print "begin....."
while True:
    con,addr = s.accept()
    #cons.append(con)
    print con
    while True:
        data = con.recv(1024)
        if not data:
            con.close()
            break;
        print data
        con.send("123")
s.close()

客户端可以向服务器发送“ ok”,但不能从服务器接收“ 123”。

如果我使用用python编写的客户端,则服务器和客户端可以很好地通信。

有人能说出这个错误的原因吗?

使用tcp::socket::read_some方法。 该方法将阻塞,直到套接字接收到某些内容,然后读取数据为止(而read(...)函数将读取整个文件/套接字,直到EOF为止(仅当连接断开时才会发生))

您可以在此处阅读用法。

例:

std::string recbuf;
while (true)
{
    //write data
    sock.write_some(buffer("ok", 2));
    //read data
    sock.read_some(buffer(recbuf, 1024), ec);
    //handle error
    if (ec && ec != error::eof) {
        std::cout << "receive failed: " << ec.message() << std::endl;
    }
    else {
        std::cout << recbuf << std::endl;
    }
}

我发现了类似的问题boost :: asio :: ip :: tcp :: socket没有读取任何内容

使用read_until可以解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM