C 初識window下 IOCP網路模式

2021-10-07 07:08:30 字數 2710 閱讀 1844

#define win32_lean_and_mean

#include#include#pragma comment(lib,"ws2_32.lib")

#include#pragma comment(lib,"mswsock.lib")

#include#define nclient 10

enum io_type

;//資料緩衝區空間大小

#define data_buff_size 1024

struct io_data_base

;//向iocp投遞接受連線的任務

void postaccept(socket sockserver, io_data_base* pio_data) }}

//向iocp投遞接收資料的任務

void postrecv(io_data_base* pio_data)

; wsbuff.buf = pio_data->buffer;

wsbuff.len = data_buff_size;

dword flags = 0; }

}//向iocp投遞傳送資料的任務

void postsend(io_data_base* pio_data)

; wsbuff.buf = pio_data->buffer;

wsbuff.len = pio_data->length;

dword flags = 0; }

}//-- 用socket api建立簡易tcp服務端

//-- iocp server基礎流程

int main()

; _sin.sin_family = af_inet;

_sin.sin_port = htons(4567);//host to net unsigned short

_sin.sin_addr.s_addr = inaddr_any;

// 2.2 繫結sockaddr與serversocket

if (socket_error == bind(sockserver, (sockaddr*)&_sin, sizeof(_sin)))

else

// 3 監聽serversocket

if (socket_error == listen(sockserver, 64))

else

//-------iocp begin-------//

//4 建立完成埠iocp

handle _completionport = createiocompletionport(invalid_handle_value, null, 0, 0);

if (null == _completionport)

//5 關聯iocp與serversocket

//完成鍵

auto ret = createiocompletionport((handle)sockserver, _completionport, (ulong_ptr)sockserver, 0);

if (!ret)

//6 向iocp投遞接受連線的任務

io_data_base iodata[nclient] = {};

for (int n = 0; n < nclient; n++)

int msgcount = 0;

while (true)

if (error_netname_deleted == err)

printf("getqueuedcompletionstatus failed with error %d\n", err);

break;

} 接受鏈結 完成

if (io_type::accept == piodata->iotype)

向iocp投遞接收資料任務

postrecv(piodata);

} 接收資料 完成 completion

else if (io_type::recv == piodata->iotype)

printf("收到資料: sockfd=%d, bytestrans=%d msgcount=%d\n", piodata->sockfd, bytestrans, ++msgcount);

piodata->length = bytestrans;

向iocp投遞傳送資料任務

postsend(piodata);

} 傳送資料 完成 completion

else if (io_type::send == piodata->iotype)

printf("傳送資料: sockfd=%d, bytestrans=%d msgcount=%d\n", piodata->sockfd, bytestrans, msgcount);

向iocp投遞接收資料任務

postrecv(piodata);

} else

} //------------//

關閉clientsocket

for (int n = 0; n < nclient; n++)

關閉serversocket

closesocket(sockserver);

關閉完成埠

closehandle(_completionport);

//清除windows socket環境

wsacleanup();

return 0;

}

初識Linux下的C語言

最近在複習c語言的相關知識,發現自己從來沒有在linux下使用過c語言,因此在慕課網上找到了相關的教程,學習了在linux環境下執行c程式的基礎知識。記錄如下 sudo apt get install vim sudo apt get install gcc在home目錄下建立乙個用於儲存c程式的目...

window下 c 訪問mongodb之安裝驅動

windows下c 若想訪問mongodb需要安裝官方驅動。我按照官網的提示做了這個教程。廢話不說直接開始。步驟1 安裝cmake 步驟3 編譯,安裝mongo c driver cmd命令列中執行 cd mongo c driver 1.8.2 src libbson cmake g visual...

c語言在window下的多執行緒例項

include include include include int piao 100 pthread mutex t mut void tprocess1 void args else pthread mutex unlock mut if a 1 return null void tproce...