C SOCKET通訊模型(一)select

2021-08-07 07:31:40 字數 3469 閱讀 8124

為了**簡潔,socket上那些函式的返回錯誤值我就不再捕獲了,windows平台

server.cpp

#define fd_setsize 2048

// normal.cpp: 定義控制台應用程式的入口點。

//#include "stdafx.h"

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

unsigned int winapi createserv(lpvoid args);

unsigned int winapi proc(lpvoid args);

using namespace std;

const int _thread_count = 8;

fd_set _readset;

fd_set _writeset;

list_socklist;

list_removelist;

mutex lock4cv;

mutex lock4cv2;

condition_variable cv;

condition_variable cv2;

int _thread_unfinish;

vector_vec;

char* buf2 = "hello client";

int main()

_beginthreadex(0, 0, createserv, 0, 0, 0);

for(int i=0;i<_thread_count;i++)

cin.get();

cin.get();

return 0;

}bool _isfinish()

unsigned int winapi proc(lpvoid args)

_vec[*i] = 0;

} int start = ceil(_socklist.size() / (double)_thread_count)* *i;

if(start<*i)

if(_socklist.size()<=start)

int end = start+ ceil(_socklist.size() / (double)_thread_count);

int i = 0;

for (auto iter = _socklist.begin(); iter != _socklist.end(); ++iter)

fd_set(s, &_writeset);

//cout << buf << endl;

}if (fd_isset(s, &_writeset))

}i++;

} lock4cv2.lock();

_thread_unfinish -= 1;

cv2.notify_all();

lock4cv2.unlock(); }}

unsigned int winapi createserv(lpvoid args)

if (lobyte(wsadata.wversion) != 2 || hibyte(wsadata.wversion) != 1)

socket socksrv = socket(af_inet, sock_stream, 0);

const char chopt = 1;

setsockopt(socksrv, ipproto_tcp, tcp_nodelay, &chopt, sizeof(chopt));

int nsendbuflen = 16 * 1024 * 1024;

setsockopt(socksrv, sol_socket, so_sndbuf, (const char*)&nsendbuflen, sizeof(int));

ulong nonblock = 1;

ioctlsocket(socksrv, fionbio, &nonblock);

// struct in_addr s;

// inet_pton(af_inet, "127.0.0.1",(void*)&s);

sockaddr_in addrsrv;

addrsrv.sin_addr.s_un.s_addr = htonl(addr_any);

addrsrv.sin_family = af_inet;

addrsrv.sin_port = htons(6001);

::bind(socksrv, (sockaddr*)&addrsrv, sizeof(sockaddr));

err = listen(socksrv, 100);

if (err == socket_error)

//accept loop

while (true)

select(0, &_readset, &_writeset, 0, 0);

if(fd_isset(socksrv,&_readset))

else

cv.notify_all();

unique_lockl(lock4cv2);

cv2.wait(l, _isfinish);

for (auto iter = _removelist.begin(); iter != _removelist.end(); ++iter)

_removelist.clear();

} }}

client.cpp

// client.cpp: 定義控制台應用程式的入口點。

//#include "stdafx.h"

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

unsigned int winapi createclient(lpvoid args);

using namespace std;

int _time;

int main()

if (lobyte(wsadata.wversion) != 2 || hibyte(wsadata.wversion) != 1)

for (int i = 0; i < 1024 ; i++)

cin.get();

cin.get();

return 0;

}mutex m;

int c = 0;

unsigned int winapi createclient(lpvoid args)

char buf[128];

int i = 0;

sprintf_s(buf, "hello serv %d", i);

char buf2[128];

while(true)

closesocket(sock);

}

C SOCKET通訊模型(四)IOCP

相比ioevent,iocp沒有事件監聽,而是採用執行緒池管理 其實就是對使用者建立的執行緒的乙個分配管理機制,本身並不會建立多餘額外的執行緒 佇列的形式,這個系統佇列也就是所謂的完成埠,用於核心與應用層的互動。iocp沒有監聽事件數量的限制,沒有事件列表為空需要等待的問題,雖然ioevent沒有i...

C SOCKET通訊模型(七)非同步epoll

不得不說為這非同步epoll模型還真是傷了神。主要問題就是在libaio的核心通知上,因為這東西實在太低階了,用起來還比較麻煩。我為了不再多開執行緒,實現和iocp基本相同的原理,在proc內部又用了次epoll,使其核心通知和使用者通知都能在乙個執行緒中得到相同處理。並且用map對映eventfd...

高效通訊模型之 非同步通訊模型

非同步模型 非同步和同步 同步,就是在發出乙個功能呼叫時,在沒有得到結果前,呼叫不返回 非同步,當乙個非同步過程呼叫發出後,呼叫者不能立即得到呼叫結果,而是通過狀態,通知和 來通知呼叫者。通過檢查狀態來判斷非同步呼叫結果,效率會很低,因為需要週期性檢查狀態 函式和通知差不多 同步呼叫與阻塞呼叫 對於...