完成埠實現echo tcp server

2021-04-13 11:03:29 字數 3061 閱讀 1042

#include 

<

stdio.h

>

#include 

<

winsock2.h

>

#pragma

comment(lib, "ws2_32.lib")

#define

port 5150

#define

data_bufsize 8192

/**/

typedef 

struct

char

buffer[data_bufsize];

intopcode;

//傳遞操作碼

}per_io_operation_data, 

*lpper_io_operation_data;

#define

op_read   0

#define

op_write  1

#define

op_accept 2

//單句柄資料

typedef 

struct

per_handle_data,

*lpper_handle_data;

dword winapi serverworkerthread(

void

*completionportid);

intmain(

intargc, 

char

*argv)

//建立完成埠

if((completionport 

=createiocompletionport(invalid_handle_value,null,0,

0)) 

==null)

system_info systeminfo;

getsysteminfo(

&systeminfo);

dword threadid;

//建立工作者執行緒

for(

inti =0

; i 

<

systeminfo.dwnumberofprocessors*2

; i++

)closehandle(threadhandle);}if

((listensocket 

=wsasocket(af_inet, sock_stream, 

0, null, 0==

invalid_socket)

serveraddr.sin_family 

=af_inet;

serveraddr.sin_addr.s_addr 

=htonl(inaddr_any);

serveraddr.sin_port 

=htons(port);

if(bind(listensocket,(sockaddr*)

&serveraddr,

sizeof

(serveraddr)) 

==socket_error)

if(listen(listensocket, 

10) 

==socket_error)

for(;;)

lpper_handle_data perhandledata 

=(lpper_handle_data)globalalloc(gptr, 

sizeof

(per_handle_data));

printf(

"socket number %d connected

",acceptsocket);

perhandledata

->

socket 

=acceptsocket;

//新套接字控制代碼同完成埠關聯到一起。

//通過完成鍵(completionkey)引數,將單句柄資料結構傳遞給完成埠。

if(createiocompletionport((handle)acceptsocket,completionport,(dword)perhandledata,0) 

==null)

//為重疊呼叫建立單i/o運算元據

lpper_io_operation_data periodata;

periodata 

=(lpper_io_operation_data)globalalloc(gptr,

sizeof

(per_io_operation_data));

memset(

&periodata

->0,

sizeof

->

databuf.len 

=data_bufsize;

periodata

->

databuf.buf 

=periodata

->

buffer;

periodata

->

opcode 

=op_read; 

//讀操作

/*開始在接受套接字上處理i/o

* 使用重疊i/o機制,在新建的套接字上投遞乙個或多個非同步

* wsarecv 或 wsasend請求。這些i/o請求完成後,工作者執行緒

* 會為i/o請求提供服務。

*/dword recvbytes;

dword flags =0

;wsarecv(acceptsocket,

&(periodata

->

databuf),1,

&recvbytes,

&flags,

&(periodata

->

return0;

}dword winapi serverworkerthread(

void

*completionportid)

if(bytestransferred ==0

)switch

(periodata

->

opcode)    

case

op_read:

//讀完成

}}}

I O 完成埠實現

這篇文章是繼承上篇 windows 同步裝置 i o 與非同步裝置 i o 未讀過的讀者可以去看看再來看這篇文章哈。建立新的i o完成埠 i o完成可能是最複雜的windows核心物件了,為了建立乙個i o完成端 們需要呼叫createiocompletionport函式 handle winapi...

設定 i o port I O 完成埠實現

這篇文章是繼承上篇 windows 同步裝置 i o 與非同步裝置 i o 未讀過的讀者可以去看看再來看這篇文章哈。建立新的i o完成埠 i o完成可能是最複雜的windows核心物件了,為了建立乙個i o完成端 們需要呼叫createiocompletionport函式 handle winapi...

windows io完成埠例項

pragma once include pragma comment lib,ws2 32.lib define data bufsize 512 enum typedef struct io operation data io operation data class iocp include i...