C++在通过HTTP传递数据的时候如何解决超时问题?

kapil 2012-06-07 10:12:58
大家好!

现在遇到一个问题,C++以GET方式给另外一个服务器提交数据,我这边的数据量很大,一秒钟几十条数据,如果在提交数据的时候出现了超时或者网页暂时打不开的情况,程序就卡在那里,影响后面数据的接收和发送。


请问该如何解决这个问题?

能否实现那种类似UDP的方式,发出去就不管了。

另外,如果以SOCKET方式发送数据,会不会比HTTP的方式好一些?

谢谢
...全文
626 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
英雄在线 2012-06-08
  • 打赏
  • 举报
回复
建议还是用异步方式,或者是开个连接池,那个空闲就往哪个连接里面扔;不过要是开连接池的话就要考虑包排序的问题了
hzhxxx 2012-06-07
  • 打赏
  • 举报
回复

发送数据你是可以控制的,你设置超时就好了。

发射后不管。
Gloveing 2012-06-07
  • 打赏
  • 举报
回复
HTTP是使用了tcp协议,传数据还是TCP吧,但是如果你传的数据丢一点数据包也没有关系的话,可以考虑自己用UDP去传
Kaile 2012-06-07
  • 打赏
  • 举报
回复
程序就卡在那里,影响后面数据的接收和发送。

你用异步方式,发送后不管,继续发后面的,如果收到响应再调用回调函数
chelp 2012-06-07
  • 打赏
  • 举报
回复
SetSockOpt()设置时间即可
chelp 2012-06-07
  • 打赏
  • 举报
回复
讲的都是什么啊!就是一个函数的事:SetSOCKOPT()
qq120848369 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 4 楼 的回复:

引用 3 楼 的回复:

curl支持完美支持异步回调与超时.


哦?

能否给一个最简单的例子?比如抓取百度首页时,限制时间?

谢谢


例子是没有了,我做过http代理模块,方法很简单,两种路子:

1,使用curl_multi_perform,这是封装好的select+write+read+callback,你只要curl_……
[/Quote]

当时用的确学了很久,因为需要搞明白两个回调:
CURLMOPT_SOCKETFUNCTION

CURLOPT_WRITEFUNCTION
的关系,

需要搞明白:
CURLOPT_WRITEDATA

CURLMOPT_SOCKETDATA
的关系,

需要搞明白:
int curl_socket_callback(CURL *easy, /* easy handle */ curl_socket_t s, /* socket */ int action, /* see values below */ void *userp, /* private callback pointer */ void *socketp); /* private socket pointer */

size_t function( char *ptr, size_t size, size_t nmemb, void *userdata);
两个回调的关系,

还必须会用:
CURLMsg *curl_multi_info_read( CURLM *multi_handle, int *msgs_in_queue);
来结束已经完成的请求。

还必须会用:
CURLMOPT_TIMERFUNCTION,
CURLMcode curl_multi_timeout(CURLM *multi_handle, long *timeout);
回收超时socket。


其实说难不难,说简单不简单,需要熟练使用libevent和libcurl。

qq120848369 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

curl支持完美支持异步回调与超时.


哦?

能否给一个最简单的例子?比如抓取百度首页时,限制时间?

谢谢
[/Quote]

例子是没有了,我做过http代理模块,方法很简单,两种路子:

1,使用curl_multi_perform,这是封装好的select+write+read+callback,你只要curl_init+curl_setopt设置好读写回调然后curl_multi_add_handle就可以开始调curl_multi_perform了,使用curl_multi_info_read获知哪些http请求已经完成,curl_multi_remove_handle从Multi中移除掉,然后curl_close掉handle就可以了。

2,因为mutlti_perform用select,基本是个废物,所以它提供了接口让程序员使用自己的I/O事件接口,常用epoll,用法一样很简单,和1区别不大,需要自己创建epoll事件框架,官网给的指引就很清楚了:

1. Create a multi handle

2. Set the socket callback with CURLMOPT_SOCKETFUNCTION

3. Set the timeout callback with CURLMOPT_TIMERFUNCTION, to get to know what timeout value to use when waiting for socket activities.

4. Add easy handles with curl_multi_add_handle()

5. Provide some means to manage the sockets libcurl is using, so you can check them for activity. This can be done through your application code, or by way of an external library such as libevent or glib.

6. Call curl_multi_socket_action() to kickstart everything. To get one or more callbacks called.

7. Wait for activity on any of libcurl's sockets, use the timeout value your callback has been told

8, When activity is detected, call curl_multi_socket_action() for the socket(s) that got action. If no activity is detected and the timeout expires, call curl_multi_socket_action(3) with CURL_SOCKET_TIMEOUT


http://curl.haxx.se/libcurl/c/curl_multi_socket_action.html 有兴趣自己看。
风拂林 2012-06-07
  • 打赏
  • 举报
回复
win32下的话 可以试度用winhttp
yfk 2012-06-07
  • 打赏
  • 举报
回复
用事件驱动模型吧
http://blog.csdn.net/yfkiss/article/details/7553832

c++有libv、libevent、boost asio等可以使用
kapil 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

curl支持完美支持异步回调与超时.
[/Quote]

哦?

能否给一个最简单的例子?比如抓取百度首页时,限制时间?

谢谢
qq120848369 2012-06-07
  • 打赏
  • 举报
回复
curl支持完美支持异步回调与超时.

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧