本程式在同一執行緒內實現了接收端和傳送端,與上一章多執行緒聊天室 的結果類似
在編寫網路程式時,採用非同步選擇機制可能提高網路應用程式的效能,如果再配合多執行緒,將再進一步提高程式效能
#include
#pragma comment(lib, "ws2_32.lib")
if(lobyte(wsadata.wversion)!=2 || hibyte(wsadata.wversion)!=2)
private:
socket m_socket;
public:
bool initsocket(void);
protected:
afx_msg lresult onumsock(wparam wparam, lparam lparam);
public:
afx_msg void onbnclickedok();
afx_msg void ondestroy();
#define um_sock wm_user+101
bool cmy0627adlg::initsocket(void)
sockaddr_in addrsock;//位址結構體
addrsock.sin_family=af_inet;//位址族
addrsock.sin_port=::htons(6000);//埠
addrsock.sin_addr.s_un.s_addr=::htonl(inaddr_any);//收發本地任意ip
int retval;
//繫結套接字
retval=::bind(this->m_socket,(sockaddr*)&addrsock,sizeof(sockaddr));
//與指定的ip和埠繫結
if(socket_error==retval)
retval=::wsaasyncselect(this->m_socket,this->m_hwnd,um_sock,fd_read);
//請求乙個其於windows訊息的網路事件通知//一旦有資料來,就會觸發fd_read事件,通過自定義訊息um_sock來呼叫執行緒
if(socket_error==retval)
return true;
}
begin_message_map(cmy0627adlg, cdialogex)
on_wm_paint()
on_wm_querydragicon()on_message(um_sock, &cmy0627adlg::onumsock)on_bn_clicked(idok, &cmy0627adlg::onbnclickedok)
on_wm_destroy()
end_message_map()
afx_msg lresult cmy0627adlg::onumsock(wparam wparam, lparam lparam)
str.format("%s 說 :%s",::inet_ntoa(addrfrom.sin_addr),wsabuf.buf);
str+="\r\n";
this->getdlgitemtexta(idc_edit1,strtemp);
str+=strtemp;
this->setdlgitemtexta(idc_edit1,str);
deletewsabuf.buf;
break; }
return 0;
}
void cmy0627adlg::onbnclickedok()
this->setdlgitemtexta(idc_edit2,"");
}void cmy0627adlg::ondestroy()
::wsacleanup();
}
C Socket 非同步 聊天室
socket 非同步通訊,執行緒池是由系統來維護執行緒的 注意 非同步呼叫時,不能使用同步呼叫的方法,會執行緒阻塞 server using system using system.collections.generic using system.text using system.net usin...
mysql 聊天室 聊天室php mysql 六
聊天室php mysql 六 相應的 資料庫 phpmyadmin mysql dump 主機 localhost 3306 資料庫 study28 資料表的結構 chat user create table chat user userid varchar 20 not null,passwd v...
聊天室程式
伺服器 include include include include include include include include define servport 8081 伺服器端口號 define bufsize 200 最大傳輸量 int main int args,char argv s...