// serverdlg.cpp : 實現檔案
//#include "stdafx.h"
#include "server.h"
#include "serverdlg.h"
#include "afxdialogex.h"
#include "winsock2.h"
#include
#include
#include
#ifdef _debug
#define new debug_new
#endif
// 用於應用程式「關於」選單項的 caboutdlg 對話方塊
class caboutdlg : public cdialogex
;protected:
virtual void dodataexchange(cdataexchange* pdx); // ddx/ddv 支援
// 實現
protected:
declare_message_map()
};caboutdlg::caboutdlg() : cdialogex(caboutdlg::idd)
void caboutdlg::dodataexchange(cdataexchange* pdx)
begin_message_map(caboutdlg, cdialogex)
end_message_map()
// cserverdlg 對話方塊
cserverdlg::cserverdlg(cwnd* pparent /*=null*/)
: cdialogex(cserverdlg::idd, pparent)
void cserverdlg::dodataexchange(cdataexchange* pdx)
begin_message_map(cserverdlg, cdialogex)
on_wm_syscommand()
on_wm_paint()
on_wm_querydragicon()
end_message_map()
extern int create_listen_thread(unsigned int listen_port);
// cserverdlg 訊息處理程式
bool cserverdlg::oninitdialog()
}// 設定此對話方塊的圖示。當應用程式主視窗不是對話方塊時,框架將自動
// 執行此操作
seticon(m_hicon, true);
// 設定大圖示
seticon(m_hicon, false);
// 設定小圖示
// todo: 在此新增額外的初始化**
create_listen_thread(8008);
return true; // 除非將焦點設定到控制項,否則返回 true
}void cserverdlg::onsyscommand(uint nid, lparam lparam)
else
}// 如果向對話方塊新增最小化按鈕,則需要下面的**
// 來繪製該圖示。對於使用文件/檢視模型的 mfc 應用程式,
// 這將由框架自動完成。
void cserverdlg::onpaint()
else
}//當使用者拖動最小化視窗時系統呼叫此函式取得游標
//顯示。
hcursor cserverdlg::onquerydragicon()
typedef struct
struct_client_msg;
socket socket_listen;
handle handle_server_listen_thread;//伺服器執行緒控制代碼
//void callback workcallback(ptp_callback_instance instance,pvoid context,ptp_work work)
////清空集合,並將socket事件放到等待集合裡
fd_zero(&fd_socket);
fd_set(p_clt_msg->socket_connected,&fd_socket);
//設定等待時間,調節這個值,可調整通訊超時時間
tv_socket.tv_sec = 5;
tv_socket.tv_usec = 0;//80000;
//等待事件完成
fd_read_num = select(2,&fd_socket,null,null,&tv_socket);
if(fd_read_num>0)//事件完成
}else//超時後事件仍未完成
send(p_clt_msg->socket_connected,(char *)send_buff,10,0);
//關閉連線客戶端的socket
//closesocket(p_clt_msg->socket_connected);
//記憶體用完後,要釋放掉
heapfree(getprocessheap(),0,p_clt_msg);
heapfree(getprocessheap(),0,recv_buf);
sleep(10);
}return ;
}dword winapi server_listen_thread(void* lpparam)
//messagebox(null,"a client connected!","server",1);
//有客戶端連線到伺服器,則立即分配一塊記憶體來儲存客戶端socket資訊
p_clt_msg = (struct_client_msg *)heapalloc(getprocessheap(),0,sizeof(struct_client_msg));
if(p_clt_msg == null)
//拷貝客戶端socket資訊到分配的記憶體塊
p_clt_msg->socket_connected = connect_socket;
p_clt_msg->addr_client.sin_addr.s_un.s_un_b.s_b1 = addr_client.sin_addr.s_un.s_un_b.s_b1;
p_clt_msg->addr_client.sin_addr.s_un.s_un_b.s_b2 = addr_client.sin_addr.s_un.s_un_b.s_b2;
p_clt_msg->addr_client.sin_addr.s_un.s_un_b.s_b3 = addr_client.sin_addr.s_un.s_un_b.s_b3;
p_clt_msg->addr_client.sin_addr.s_un.s_un_b.s_b4 = addr_client.sin_addr.s_un.s_un_b.s_b4;
p_clt_msg->addr_client.sin_family = addr_client.sin_family;
p_clt_msg->addr_client.sin_port = addr_client.sin_port;
// 現在可以建立一些項,提交給執行緒池
ptp_work ptpwork = createthreadpoolwork(workcallback,p_clt_msg,&tcbe);// 建立乙個工作項
submitthreadpoolwork(ptpwork); // 提交工作項
建立乙個新的執行緒來處理該客戶端連線
//handle_rev_data_thread = createthread(null,0,threadprocessclient,(void *)p_clt_msg,0,null);
//if(handle_rev_data_thread == null)//}
return 0;
}int create_listen_thread(unsigned int listen_port)
//獲取本機ip位址
if( gethostname(pc_name,sizeof(pc_name))==no_error )//獲取主機名稱
else
}else
//申請乙個socket做伺服器
socket_ser_listen = socket(af_inet,sock_stream,ipproto_tcp);
if(invalid_socket==socket_ser_listen)
//將本機的8008埠繫結到上面申請的伺服器socket
addr_in_ser.sin_family = af_inet;
addr_in_ser.sin_addr.s_addr =inet_addr(host_ip);
addr_in_ser.sin_port = htons(listen_port);
result = bind(socket_ser_listen, (struct sockaddr *)&addr_in_ser, sizeof(addr_in_ser));
if(socket_error==result)
//將伺服器socket置於監聽狀態
result = listen(socket_ser_listen,somaxconn);
if(socket_error==result)
//建立伺服器監聽執行緒
socket_listen = socket_ser_listen;//將伺服器socket放到全域性變數裡傳給伺服器執行緒,不能用
handle_server_listen_thread = createthread(null,0,server_listen_thread,(void *)&socket_listen,0,null);
if( null==handle_server_listen_thread )
return 0;
}
Windows系統執行緒池
需要強調的是下面這句 呼叫queueuserworkitem時傳入的object型別引數傳遞到任務過程,可以通過這種方式來向任務過程傳遞引數 如果任務過程需要多個引數 可以定義包含這些資料的類,並將其 強制轉換 為object資料型別 在ms提供的windows service的c 例程中,提供了乙...
執行緒 執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...
執行緒 執行緒池
乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...