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