免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 23759 | 回复: 40
打印 上一主题 下一主题

[其他] windows 完成端口就是一个巨大的屎坑 [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-14 18:00 |只看该作者 |倒序浏览
好吧, 我承认倒霉, 异想天开想用完成端口, 结果跌到屎坑里了;
其他话不说吧, 都是泪, 现在这问题完全似乎是无解的:

把 socket 加入到 完成端口, 用 connectex 连接远程, 第一次成功, 也从完成端口收到通知了; 然后因为某些原因连接中断, 也收到通知了, 然后 closesocket, 再次创建, 将上面过程重来一次好吧, 靠, 网络状态是连接成功了, 狗日的完成端口死活不给通知

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2014-08-14 22:54 |只看该作者
你是IOCP用在客户端?连接数不多还是别用IOCP了。
我以前都是用在服务端的,是有一些坑,主要是一些错误处理上,翻遍资料也不知道正确答案。最后反正发生有些错误时,把连接close了重新来。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
3 [报告]
发表于 2014-08-15 07:06 来自手机 |只看该作者
对头。有时候就是会莫名奇妙的丢包。弄得我一头雾水。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2014-08-15 08:14 |只看该作者
实现地和大便收集器一样,
还要求线程处于Alert状态。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
5 [报告]
发表于 2014-08-15 15:01 |只看该作者
哈哈, 确实, 给个类epoll的接口这么难么---还愣是一定要把线程池扯进去--

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
6 [报告]
发表于 2014-08-15 15:09 |只看该作者
我以前也曾搞过完成端口
还是在网友指点下完成的
搞过一次就永不想再搞了
从没见过如斯破碎的架构
性能顶屁用,不能加工资
代码如女人,悦目者为上

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
7 [报告]
发表于 2014-08-15 15:33 |只看该作者
楼上犀利啊。。。

论坛徽章:
35
双子座
日期:2014-05-09 17:56:38程序设计版块每日发帖之星
日期:2015-08-30 06:20:00程序设计版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-27 11:07:07程序设计版块每日发帖之星
日期:2016-01-12 06:20:0015-16赛季CBA联赛之北京
日期:2016-01-15 01:01:2115-16赛季CBA联赛之浙江
日期:2016-01-15 22:38:20程序设计版块每日发帖之星
日期:2016-01-18 06:20:00每日论坛发贴之星
日期:2016-01-18 06:20:0015-16赛季CBA联赛之北控
日期:2016-01-30 21:43:01程序设计版块每日发帖之星
日期:2016-02-08 06:20:0015-16赛季CBA联赛之山西
日期:2016-02-20 10:54:41
8 [报告]
发表于 2014-08-15 15:37 来自手机 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2014-08-15 16:56 |只看该作者
完成端口可没有你们说的那么烂。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
10 [报告]
发表于 2014-08-15 18:38 |只看该作者
回复 9# wjtmain


靠: 首先使用这个函数创建 udp socket
int my_socket(int af, int type, int protocol)
{
    SOCKET fd = WSASocket(af, type, protocol, NULL, 0, WSA_FLAG_OVERLAPPED);
    if (fd == INVALID_SOCKET) {
        int n = WSAGetLastError();
        return -1;
    }

    if (type == SOCK_DGRAM) {
        struct sockaddr_in in = {0};
        in.sin_family = AF_INET;
        in.sin_port = 0;
        in.sin_addr.s_addr = INADDR_ANY;
        int n = bind(fd, (struct sockaddr *) &in, sizeof(in));
        if (n == -1) {
            close(fd);
            return -1;
        }
    }
    return (int) fd;
}

然后加入 完成端口

再然后通过这个函数读数据:
int do_udp_read(int fd, struct my_buffer* mbuf)
{
    io_context* ioc = (io_context *) mbuf;
    DWORD flags = 0, bytes = 0;
    struct sockaddr_in in;
    int sz = sizeof(sockaddr);

    int n = WSARecvFrom(fd, &ioc->wsa_buffer, 1, &bytes, &flags, (sockaddr *) &in, (LPINT) &flags, &ioc->overlap, NULL);
    DWORD code = WSAGetLastError();
    if (n == 0 || WSA_IO_PENDING == code) {
        return 0;
    }

    errno = EFAILED;
    return -1;
}
ioc->wsa_buffer 确定指向合法缓冲区

狗日的报 10014, 谁知道是为什么!!!!!!

妈的, 要不是我的网络代码是使用我自己在 linux 上用 epoll 实现的框架, 要移植到 windows 看样子只有完成端口才可行, 谁他妈的会用的烂东西, 操
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP