zylthinking 发表于 2014-08-14 18:00

windows 完成端口就是一个巨大的屎坑

好吧, 我承认倒霉, 异想天开想用完成端口, 结果跌到屎坑里了;
其他话不说吧, 都是泪, 现在这问题完全似乎是无解的:

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

hellioncu 发表于 2014-08-14 22:54

你是IOCP用在客户端?连接数不多还是别用IOCP了。
我以前都是用在服务端的,是有一些坑,主要是一些错误处理上,翻遍资料也不知道正确答案。最后反正发生有些错误时,把连接close了重新来。

cobras 发表于 2014-08-15 07:06

对头。有时候就是会莫名奇妙的丢包。弄得我一头雾水。

folklore 发表于 2014-08-15 08:14

实现地和大便收集器一样,
还要求线程处于Alert状态。

hanxin83 发表于 2014-08-15 15:01

哈哈, 确实, 给个类epoll的接口这么难么---还愣是一定要把线程池扯进去--

bruceteen 发表于 2014-08-15 15:09

我以前也曾搞过完成端口
还是在网友指点下完成的
搞过一次就永不想再搞了
从没见过如斯破碎的架构
性能顶屁用,不能加工资
代码如女人,悦目者为上

zhaohongjian000 发表于 2014-08-15 15:33

楼上犀利啊。。。

__BlueGuy_ 发表于 2014-08-15 15:37

wjtmain 发表于 2014-08-15 16:56

完成端口可没有你们说的那么烂。

zylthinking 发表于 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 看样子只有完成端口才可行, 谁他妈的会用的烂东西, 操
页: [1] 2 3 4 5
查看完整版本: windows 完成端口就是一个巨大的屎坑