windows 完成端口就是一个巨大的屎坑
好吧, 我承认倒霉, 异想天开想用完成端口, 结果跌到屎坑里了;其他话不说吧, 都是泪, 现在这问题完全似乎是无解的:
把 socket 加入到 完成端口, 用 connectex 连接远程, 第一次成功, 也从完成端口收到通知了; 然后因为某些原因连接中断, 也收到通知了, 然后 closesocket, 再次创建, 将上面过程重来一次好吧, 靠, 网络状态是连接成功了, 狗日的完成端口死活不给通知
你是IOCP用在客户端?连接数不多还是别用IOCP了。
我以前都是用在服务端的,是有一些坑,主要是一些错误处理上,翻遍资料也不知道正确答案。最后反正发生有些错误时,把连接close了重新来。 对头。有时候就是会莫名奇妙的丢包。弄得我一头雾水。 实现地和大便收集器一样,
还要求线程处于Alert状态。
哈哈, 确实, 给个类epoll的接口这么难么---还愣是一定要把线程池扯进去-- 我以前也曾搞过完成端口
还是在网友指点下完成的
搞过一次就永不想再搞了
从没见过如斯破碎的架构
性能顶屁用,不能加工资
代码如女人,悦目者为上 楼上犀利啊。。。 完成端口可没有你们说的那么烂。 回复 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 看样子只有完成端口才可行, 谁他妈的会用的烂东西, 操