标签: iocp

TCP/IP IOCP received data sometimes corrupt - Visual C++ on Windows

I am writing a simple test ICOP client and server to ensure I am using the API correctly and that the data the client sending is being received correctly by the server. I have included all the code for this question.

This is where I ran into some problems, that the data within the receive buffers sometimes seems to be corrupted (corrupted in that sometimes chunks of data within buffers can be out of order or missing). To be clear, …

c++ sockets tcp corrupt iocp

6
推荐指数
1
解决办法
2258
查看次数

使用 I/O 完成端口的异步操作返回传输的 0 字节

尽管 I/O 操作按预期工作(我的读取缓冲区已满),但使用 I/O 完成端口的异步操作返回传输的 0 个字节。

BYTE buffer[1024] = {0};
OVERLAPPED o = {0};
HANDLE file = CreateFile(
    _T("hello.txt"),
    GENERIC_READ,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,
    NULL
);
HANDLE completion_port = CreateIoCompletionPort(
    file,
    NULL,
    0,
    0
);
ReadFile(
    file,
    buffer,
    1024,
    NULL,
    &o
);
Run Code Online (Sandbox Code Playgroud)

在工作线程中:

DWORD numBytes = 0;
LPOVERLAPPED po;
GetQueuedCompletionStatus(
    completion_port,
    &numBytes,
    0,
    &po,
    INFINITE
);
GetOverlappedResult(file, &o, &numBytes, FALSE);
Run Code Online (Sandbox Code Playgroud)

这两个函数都返回 numBytes 中的 0 个字节,但buffer正在填充。这是预期的行为吗?

谢谢。

c++ windows winapi asynchronous iocp

5
推荐指数
1
解决办法
2190
查看次数

支持重叠I/O的定时器(对于IOCP)?

我需要在基于I/O完成端口(IOCP)的应用程序中添加定时器支持.我想避免使用特定的线程来管理计时器.

在Linux上,您可以创建一个通过文件描述符提供过期通知的计时器(请参阅timerfd.h man),因此如果您的应用程序基于epoll,那么将它用于epoll非常棒.

在Windows上,您可以使用"waitable timers"和异步过程调用(ACP)(请参阅http://msdn.microsoft.com/en-us/library/ms686898(v=VS.85).aspx)

如果您有兴趣,kqueue(BSD,Mac OS)默认支持计时器(请参阅EVFILT_TIMER).

使用I/O完成端口,我们必须使用支持重叠I/O的objets.那么,IOCP有这样的计时器吗?

最好的祝福,

Cédrics

timer filehandle iocp overlapped-io

5
推荐指数
1
解决办法
2314
查看次数

如何同时等待 I/O 完成端口和事件?

有没有可能的方法来实现这一目标?

例如,我有一个 I/O 完成端口,10 个工作线程正在从中提取任务。每个任务都与一个对象相关联。有些对象不能同时处理,因此如果一个线程正在处理这些对象之一,而第二个线程提取需要该对象的任务,则第二个线程必须等待第一个线程完成。

作为解决方法,对象可以有一个在释放时发出信号的事件。如果线程因接收到的任务需要锁定对象而“卡住”,则它可以等待锁定对象被释放,或者等待新任务排队。如果它接收到一个新任务,它会将无法处理的任务推回到队列中。

我知道其他方法,但这似乎是应该存在的功能。这可以通过Windows API 来实现吗?

c c++ winapi multithreading iocp

5
推荐指数
1
解决办法
1754
查看次数

IO完成端口是否在完成端口报告之前或之后生成新线程?

我对IO完成端口完成时实际发生的事情感到有些困惑.

我假设Win API允许访问IOCP队列,该队列能够以某种方式对具有特定句柄的回调引用进行排队(或堆栈)(比如说套接字).当Windows从NIC接收到中断时,它会在某个时刻到达NIC的IOCP队列并在其自己的(IOCP)线程池上执行回调.

我的问题是,来自线程池的线程是在接收到中断时产生的,还是在调用Win API时实际产生的,有效地使线程处于等待状态,直到它被IOCP唤醒队列?

编辑:
我发现了这个:http://msmvps.com/blogs/luisabreu/archive/2009/06/04/multithreading-io-and-the-thread-pool.aspx其中是状态:"每当该操作完成时,它将在该I/O完成端口上对数据包进行排队.然后该端口将继续并使用其中一个线程池的线程来运行您指定的回调."

windows winapi iocp

5
推荐指数
1
解决办法
488
查看次数

可以将臭名昭着的"ERROR_NETNAME_DELETED"错误视为错误吗?

我正在使用完成端口在Windows NT中编写tcp服务器以利用异步I/O. 我有一个TcpSocket类,一个TcpServer类和一些(虚函数)回调在I/O操作完成时调用,例如onRead()用于读取完成时.我在建立连接时也有onOpen(),在连接关闭时也有onEof(),依此类推.我总是有套接字的挂起读取,所以如果套接字有效地获取数据(读取将完成大小> 0)它调用onRead(),而不是客户端客户端关闭套接字(读取将是完成大小== 0)它调用onEof(),服务器知道客户端何时用closesocket(server_socket)关闭套接字; 从它的角度来看.

一切都优雅,但我注意到了一件事:

当我调用closesocket(client_socket); 在连接的服务器端端点,而不是客户端端(设置为linger {true,0}或不设置),挂起的读取将完成为错误,即读取大小不仅是== 0,但GetLastError()也返回错误:64,或'ERROR_NETNAME_DELETED'.我在网上搜索了很多这个,但没有发现任何有趣的东西.

然后我问自己:但这是一个真正的错误吗?我的意思是,这真的可以被视为错误吗?

问题是在服务器端,当我关闭socket(client_socket)时,将调用onError()回调; 而不是onEof().所以我想这个:

如果我收到此'ERROR_NETNAME_DELETED'"错误",请调用onEof()而不是onError()?会引入一些错误或未定义的行为吗?让我问这个问题的另一个重点是:

当我通过'ERROR_NETNAME_DELETED'收到此读取完成时,我检查了OVERLAPPED结构,特别是包含底层驱动程序的NTSTATUS错误代码的overlapped-> Internal参数.如果我们看到一个NTSTATUS错误代码列表[ http://www.tenox.tc/links/ntstatus.html ],我们可以清楚地看到'ERROR_NETNAME_DELETED'是由NTSTATUS 0xC000013B生成的,这是一个错误,但它是称为"STATUS_LOCAL_DISCONNECT".好吧,它看起来不像是错误的名称.看起来更像是"ERROR_IO_PENDING"这是一个错误,但也是一个正确行为的状态.

那么检查OVERLAPPED结构的Internal参数怎么样呢?当这是==到'STATUS_LOCAL_DISCONNECT'时,会执行对onEof()回调的调用?会弄得一团糟吗?

另外,我必须说,从服务器端,如果我在调用closesocket(client_socket)之前调用DisconnectEx(); 我不会收到那个错误.但是我不想叫DisconnectEx()呢?例如,当服务器关闭并且不想等待所有DisconnectEx()完成时,但只想关闭所有客户端的连接.

c++ winapi network-programming tcp iocp

5
推荐指数
1
解决办法
4376
查看次数

是否有可能知道通过API调用在IOCP上排队了多少未处理的已完成操作?

我正在使用C#套接字(使用IOCP进行回调).我想要一种方法来确定我的处理逻辑落后的天气.是否有API调用可以为我提供未被回调处理的已完成操作的大小?

我已经考虑过使用类似心跳操作的东西,我会发布到队列中,并确定我是否已经过了回调的时间,但我希望在可能的情况下更直接的路由(另外我没有轻松访问)到.Net内部控制的IOCP句柄).

.net c# sockets iocp

5
推荐指数
1
解决办法
207
查看次数

SSL_read 失败并显示 SSL_ERROR_SSL

我正在编写一个 https 服务器。我已经创建了 csr 并使用我的测试域的根证书对其进行了签名。当客户端连接时,SSL_accept() 成功完成。我正在使用非阻塞 IO。因此,我将首先在 Windows 中使用 WSARecv() 和 IOCP 异步接收字符缓冲区中的数据。从该字符缓冲区,我将其写入 BIO(BIO_write 返回写入的字节数)并尝试使用 SSL_read() 解密该 BIO 的内容时,它返回 ssl_error_ssl 和错误字符串作为错误:00000001:lib(0):func (0):原因(1)。

我在这里添加了我的代码结构。

const SSL_METHOD *method;
SSL_CTX *ctx;

method = SSLv23_method();    /* create new server-method instance */
ctx = SSL_CTX_new(method);   /* create new context from method */
if ( ctx == NULL )
{
    printf("SSL Context Creation failed\n");
}

//create bio
BIO *bioIn = BIO_new(BIO_s_mem());
BIO *bioOut = BIO_new(BIO_s_mem());

/* get new SSL state with context */
SSL *clientSSL = …
Run Code Online (Sandbox Code Playgroud)

c++ openssl iocp

5
推荐指数
1
解决办法
9153
查看次数

WSAConnect()vs ConnectEx()

我在我的客户端使用IOCP,但我发现在连接服务器时使用阻塞调用更方便.那么在使用IOCP时使用阻塞WSAConnect()而不是非阻塞是否存在任何问题ConnectEx()

c++ sockets winapi winsock iocp

5
推荐指数
1
解决办法
1169
查看次数

IO完成端口初始读取和双向数据

我有以下简化的 IO 完成端口服务器 C++ 代码:

int main(..)
{
    startCompletionPortThreadProc();

    // Await client connection

    sockaddr_in clientAddress;
    int clientAddressSize = sizeof( clientAddress );
    SOCKET acceptSocket = WSAAccept( serverSocket, (SOCKADDR*)&clientAddress, &clientAddressSize, NULL, NULL);  

    // Connected

    CreateIoCompletionPort( (HANDLE)acceptSocket, completionPort, 0, 0 );

    // Issue initial read
    read( acceptSocket );
}


DWORD WINAPI completionPortThreadProc( LPVOID param )
{
    DWORD bytesTransferred = 0;
    ULONG_PTR completionKey = NULL;
    LPPER_IO_DATA perIoData = NULL;

    while( GetQueuedCompletionStatus( completionPort, &bytesTransferred, &completionKey, (LPOVERLAPPED*)&perIoData, INFINITE ) )
    {
        if( WaitForSingleObject( exitEvent, 0 ) …
Run Code Online (Sandbox Code Playgroud)

c++ iocp winsock2

5
推荐指数
1
解决办法
600
查看次数