Overlapped I/O mit Completion Ports
-
Guten Tag,
ich habe gerade mal ein bisschen mit asynchronen Sockets rumgebastelt, aber das will so irgendwie nicht funktionieren.
(Ich weiß dass ich da nichts freigebe und ein paar Abfragen fehlen, aber ich will erst mal nur dass es funktioniert.)
In der markierten Zeile failt WSARecv mit 10022.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668Invalid argument.
Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.Wenn ich stattdessen das "normale" recv() benutze, funktioniert alles wie es soll.
HANDLE completion_port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0); if (completion_port == 0) throw_windows_error(); WSADATA wsadata; if (WSAStartup(WINSOCK_VERSION, &wsadata) != 0) throw_windows_error(); SOCKET s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED); if (s == INVALID_SOCKET) throw_winsock_error(); if (!CreateIoCompletionPort(reinterpret_cast<HANDLE>(s), completion_port, 0, 0)) throw_windows_error(); sockaddr_in addr = {}; addr.sin_addr.s_addr = inet_addr("173.194.35.146"); addr.sin_family = PF_INET; addr.sin_port = htons(80); if (connect(s, (sockaddr*)&addr, sizeof addr) == SOCKET_ERROR) throw_winsock_error(); const char* const msg = "GET / HTTP/1.0\r\nHost: www.google.com\r\n\r\n"; std::vector<char> buf(0x10000); WSABUF wsabuf; wsabuf.buf = buf.data(); wsabuf.len = buf.size(); WSAOVERLAPPED overlapped2 = {}; DWORD bytes = 0, flags = 0; send(s, msg, strlen(msg), 0); //buf[recv(s, &buf[0], buf.size() - 1, 0)] = '\0'; int r2 = WSARecv(s, &wsabuf, 1, &bytes, &flags, &overlapped2, on_recv); // <- Hier <- <- <- if (r2 == SOCKET_ERROR && (r2 = WSAGetLastError()) != WSA_IO_PENDING) throw_winsock_error(r2); std::cout << "Blubb: \n"; SleepEx(INFINITE, TRUE);
Was läuft da schief?
-
Du gibst eine Completion Routine an, obwohl du den Socket schon an den Completion Port gebunden hast
-
Aaach so, Completion Routines und Completion Ports sollte man wohl nicht in einen Topf werfen. Hat sich erledigt, danke!