Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >客户端无法在客户端接收带有socket.async_receive的数据异常

客户端无法在客户端接收带有socket.async_receive的数据异常
EN

Stack Overflow用户
提问于 2013-03-22 00:15:29
回答 1查看 2.6K关注 0票数 0

我有一个简单版本的客户端使用boost asio。一旦客户端发送数据,它就会收到来自服务器的响应。这是客户端的代码

代码语言:javascript
代码运行次数:0
复制
void RunClient()
    {
        try
        {
            boost::asio::io_service io_service;
            boost::asio::ip::tcp::resolver resolver(io_service);
            boost::asio::ip::tcp::resolver::query query( "127.0.0.1", boost::lexical_cast< std::string >( 7777 )); //9100
            boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
            boost::asio::ip::tcp::socket socket(io_service);
            socket.async_receive(boost::asio::buffer(buf_client, 3000), 0, ClientReceiveEvent);

            boost::asio::connect(socket, endpoint_iterator);

            boost::system::error_code ignored_error;
            std::cout << "Sending message \n";
            boost::asio::write(socket, boost::asio::buffer("Data to send"), ignored_error);
            io_service.run();
        }
        catch (std::exception & ex)
        {
            std::cout << "[" << boost::this_thread::get_id()<< "] Exception: " << ex.what() << std::endl;   
        }
    }

这是我的ClientReceiveEvent

代码语言:javascript
代码运行次数:0
复制
void ClientReceiveEvent(const boost::system::error_code& error, std::size_t bytes_transferred)
    {
        if(!error)
        {
            std::cout << "Message: " << buf_client.data() << std::endl;

        }
        else
        {
            std::cout << "Error occurred." << error.message() << std::endl;
        }
    }

对于输入数据,我从上面的方法中得到一个错误。

代码语言:javascript
代码运行次数:0
复制
Error occurred.The file handle supplied is not valid

我在客户身上做错什么有什么建议吗?

更新:

我让代码起作用了,但是我不明白为什么这个声明

代码语言:javascript
代码运行次数:0
复制
socket->async_receive(boost::asio::buffer(buf_client, 3000), 0, ClientReceiveEvent);

需要在连接后放置。以及为什么声明

代码语言:javascript
代码运行次数:0
复制
io_service->run();

需要放在最后。我以为这会启动异步进程。

我还想知道如何将数据重新发送到服务器。我能成功地发送一次。如何重新发送命令?

工作守则是:

代码语言:javascript
代码运行次数:0
复制
boost::shared_ptr< boost::asio::io_service > io_service(new boost::asio::io_service);
            boost::shared_ptr< boost::asio::ip::tcp::socket > socket(   new boost::asio::ip::tcp::socket( *io_service ) );
            boost::asio::ip::tcp::resolver resolver(*io_service);
            boost::asio::ip::tcp::resolver::query query( "127.0.0.1", boost::lexical_cast< std::string >( 7777 )); //9100
            boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
            socket->connect(endpoint_iterator->endpoint());
            socket->async_receive(boost::asio::buffer(buf_client, 3000), 0, ClientReceiveEvent);
            boost::system::error_code ignored_error;
            std::cout << "Sending message \n";
            boost::asio::write(*socket, boost::asio::buffer("some data"), ignored_error);           
            io_service->run();
EN

回答 1

Stack Overflow用户

发布于 2013-03-22 01:44:28

虽然async_receive计划在代码调用run()之后执行读操作,但在调用async_receive函数本身时,它仍然需要一个连接的套接字。这是因为在内部,async_receive的实现如下:

代码语言:javascript
代码运行次数:0
复制
this->get_service().async_receive(this->get_implementation(),buffers, 0, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));

this->get_implementation()表达式返回内部套接字句柄的副本,在您的情况下没有连接。

换句话说,异步读取计划完成后,它将无助于连接套接字,因为读取将被安排在未连接的套接字上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15565633

复制
相关文章
Netty接收客户端连接
昨天的'Netty从0到1的运作流程'文章中我们介绍了Netty如何启动以及如何接收客户端请求, 如果有疑惑可以给我发邮件promiss217@outlook.com或者去我的个人站点https://www.infuq.com/manual/feedback.html提反馈信息.
书唐瑞
2022/06/02
1.4K0
qtcpsocket 客户端_qtcpsocket接收结构体数据
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/30
1.3K0
苹果客户端上传图片java接收
ASIFormDataRequest *request=[ASIFormDataRequestrequestWithURL:[NSURL URLWithString:urlstr]];    //分界线的标识符     NSString*TWITTERFON_FORM_BOUNDARY = @"AaB03x";     //分界线--AaB03x     NSString*MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];     //结束符AaB03x--     NSString*endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];    //声明结束符:--AaB03x--     NSString*end=[[NSString alloc]initWithFormat:@"rn%@",endMPboundary];    //声明myRequestData,用来放入http body    NSMutableData *myRequestData=[NSMutableData data];    NSMutableString *body=[[NSMutableString alloc]init];    //将body字符串转化为UTF8格式的二进制    [myRequestData appendData:[bodydataUsingEncoding:NSUTF8StringEncoding]];    //将image的data加入     UIImage*image = [UIImage imageNamed:@"1212312.png"];     NSData *imageData = UIImagePNGRepresentation(image);     [requestsetData:imageData withFileName:@"1122.png"andContentType:@"image/png" forKey:@"photo"];     [requestsetPostValue:string forKey:@"note"];//额外的文字参数    //加入结束符--AaB03x--    [myRequestData appendData:[enddataUsingEncoding:NSUTF8StringEncoding]];    NSLog(@"myRequestData = %@",myRequestData);    //设置HTTPHeader中Content-Type的值     NSString*content=[[NSString alloc]initWithFormat:@"multipart/form-data;boundary=%@",TWITTERFON_FORM_BOUNDARY];     [requestaddRequestHeader:@"Content-Type" value:content];     [requestaddRequestHeader:@"Content-Length" value:[NSStringstringWithFormat:@"%d", [myRequestData length]]];     [requestsetPostBody:myRequestData];     [requestsetRequestMethod:@"POST"];     [requeststartAsynchronous];
用户2192970
2019/02/21
1.8K0
Redis客户端常见异常分析
在Redis客户端的使用过程中,无论是客户端使用不当或者Redis服务端出现问题,客户端会反应出一些异常,下面分析一下Jedis使用过程中常见的异常情况:
九州暮云
2019/08/21
3.7K0
Redis客户端常见异常分析
Android客户端性能异常类
分为:较轻的影响是UI的卡顿掉帧; 比较大的影响是ANR(Application Not Responding):能恢复的ANR;不能恢复的ANR-永久性卡死问题。
Steve Wang
2021/12/06
4.1K0
Android客户端性能异常类
redis在java客户端的操作
redis高性能,速度快,效率高的特点,用来做缓存服务器是很不错的选择。(和memcache相似) redis在客户端的操作步骤: 1.redis单机版操作 1.1通过Jedis对象操作 (1)将安装redis服务的服务器的ip地址和redis的端口号作为构造参数传递给Jedis,用来创建一个Jedis对象   Jedis jedis  = new Jedis(ip,port); (2)通过第一步创建的jedis对象,操作redis的5大数据类型(hash类型,string类型,list类型,set类型,
用户2146856
2018/05/18
1.5K0
CM部署客户端配置失败异常分析
在Cloudera Manager修改了服务的客户端配置后,执行部署客户配置报如下异常:
Fayson
2018/09/29
2.9K1
java客户端无法上传文件到hdfs
学些hadoop。遇到这个问题,查找网上好多资料,一般都是说namenode和datanode不同步导致的,或者防火墙没开50010端口,或者nameNode和datanode无法通信导致的。
frontoldman
2019/09/02
2.9K0
客户端访问CDN网络异常排查流程
在处理客户CDN问题的过程中,很大一部分问题主要集中在部分客户端访问异常。如果要排查客户端访问异常,就不得不先讲解一下客户访问CDN域名经过的路径。
苏欣
2019/08/20
10.3K1
Netty在Redis客户端中的应用
在使用Redisson作为客户端,它需要与服务端进行通信,那么它的底层通信使用的是Netty.
书唐瑞
2022/06/02
1.7K0
Netty在Redis客户端中的应用
在Windows上配置NFS客户端
腾讯云文件存储(Cloud File Storage,CFS) 提供了标准的 NFS 文件系统访问协议,这里,我将带领各位快速上手Windows NFS客户端配置。
雷龙
2021/06/30
22.6K0
在Windows上配置NFS客户端
在客户端创建要素图层 (FeatureLayer)
在 ArcGIS JS API 的开发中, FeatureLayer 可以说是让人又爱又恨, 特别是 ArcGIS JS API 4.x , FeatureLayer 从服务端加载数据的策略不可控制, 或者说默认的数据加载策略不适合所有的场景, 某些场景下, 需要从先加载数据, 然后在客户端创建 FeatureLayer 。
beginor
2020/09/22
1.7K0
WCF系列教程之WCF客户端异常处理
本文参考自:http://www.cnblogs.com/wangweimutou/p/4414393.html,纯属读书笔记,加深记忆 一、简介 当我们打开WCF基础客户通道,无论是显示打开还是通过调用操作自动打开、使用客户端或者通过对象调用操作,或者关闭基础客户端通道,都会在客户端应用程序中出现异常,WCF是基于网络的通讯服务,错误异常也是要基于消息传递的,在WCF中提供了一个错误消息处理的类FaultException,WCF客户端可以通过它,来接收服务端传递回来的异常信息。 二、WCF异常类型 1、
郑小超.
2018/01/26
1.2K0
java实现客户端服务端互发消息并接收
一、总的来说,先了解它们的组成部分 基于TCP协议的服务器端 1.创建服务器套接字,绑定端口号(new ServerSocket(1008)) 2.侦听客户连接,返回socker(listener.accept()) 3.获输入、输出流 4.处理数据 5.关闭资源 基于TCP协议的客户端 1.创建客户端套接字,指定服务器的地址和端口号 2.获输入、输出流
2020/10/23
3.6K0
WPF 通过多进程实现异常隔离的客户端
当 WPF 客户端需要实现插件系统的时候,一般可以基于容器或者进程来实现。如果需要对外部插件实现异常隔离,那么只能使用子进程来加载插件,这样插件如果抛出异常,也不会影响到主进程。WPF 元素无法跨进程传输,但是窗口句柄(HWND)可以,所以可以将 WPF 元素包装成 HWND,然后通过进程间通信将插件传输到客户端中,从而实现插件加载。
沙漠尽头的狼
2021/12/01
1.4K0
WPF 通过多进程实现异常隔离的客户端
Kafka生产者客户端几种异常Case详解
ProducerBatch#completeFutureAndFireCallbacks
石臻臻的杂货铺[同名公众号]
2022/05/14
6.5K0
Kafka生产者客户端几种异常Case详解
HTML5在客户端存储数据的新方法——localStorage
HTML5在客户端存储数据的新方法——localStorage localStorage作为HTML5本地存储web storage特性的API之一,主要作用是将数据保存在客户端中,而客户端一般是指上海网站设计用户的计算机。 在移动设备上,由于大部分浏览器都支持web storage特性,因此在android和ios等智能手机上的web浏览器都能正常使用该特性。 localStorage保存的数据,一般情况下是永久保存的,也就是说只要采用localstorage保存信息,数据便一直存储在用户的客户端中。即使
王小婷
2018/06/01
1.6K0
通用媒体客户端数据 CMCD
CMCD(Common Media Client Data) 是由 CTA WAVE(Web Application Video Ecosystem) 创立的项目,并得到了 Apple、Hulu、Dolby 等组织的支持。并在 2020 年 9 月发布。
用户1324186
2022/02/18
1.6K0
通用媒体客户端数据 CMCD
springboot2.0 添加全局异常拦截,防止详细的异常信息返回到客户端
一、添加配置类: import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.ErrorPage; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bea
zcqshine
2019/11/08
7710
Python socket 解析客户端数据
socket 发送和接受数据都是有一定要求的 socket 的数据其长度信息和真实内容都是需要解析才能得到的 如下解析数据,都有详细注释 def parse_data(self, msg): if len(msg) == 0: return '' # 去除二进制中的第1位 v = ord(msg[1]) & 0x7f # p 掩码的开始位 # 1位如果是 126 表接下来的两个字节才是长度 # 接下来两个是长度,加上0位和1位,就是 4
onety码生
2018/11/21
1.3K0

相似问题

无法从客户端接收数据

10

UDP客户端无法接收任何数据

11

PGJDBC:无法从客户端接收数据:

245

无法在客户端接收json

10

无法在套接字客户端接收正确的数据

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文