日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【网络编程】之七、select聊天室

發(fā)布時間:2024/4/11 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【网络编程】之七、select聊天室 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

好久沒有用MFC 來寫代碼了,手都生疏了,悲劇啊,好多API 都去查的 ?哎~~~

好了 下面把 我們聊天室的代碼貼出:


select函數(shù)封裝:

[cpp]?view plaincopy
  • BOOL?CserverDlg::Select_Server(SOCKET?sock,?int?nTime?/*?=?100?*/,?BOOL?bRead?/*?=?TRUE?*/)??
  • {??
  • ????fd_set?fdset;??
  • ????timeval?tv;??
  • ????FD_ZERO(&fdset);??
  • ????FD_SET(sock,?&fdset);??
  • ????nTime?=?nTime?>?1000???1000?:?nTime;??
  • ????tv.tv_sec??=?0;??
  • ????tv.tv_usec?=?nTime;??
  • ??
  • ????int?iRet?=?0;??
  • ????if?(?bRead?)?{??
  • ????????iRet?=?select(0,?&fdset,?NULL?,?NULL,?&tv);??
  • ????}else{??
  • ????????iRet?=?select(0,?NULL?,?&fdset,?NULL,?&tv);??
  • ????}??
  • ??
  • ????if(iRet?<=?0)?{??
  • ????????return?FALSE;??
  • ????}?else?if?(FD_ISSET(sock,?&fdset)){??
  • ????????return?TRUE;??
  • ????}??
  • ????return?FALSE;??
  • }??


  • 下面是線程函數(shù),分別是服務(wù)器和客戶端的:

    [cpp]?view plaincopy
  • static?UINT?__cdecl?ThreadProc(LPVOID?pParam);??
  • [cpp]?view plaincopy
  • UINT?CserverDlg::ThreadProc(LPVOID?lpParameter?)??
  • {??
  • ????ASSERT(lpParameter);??
  • ????CserverDlg?*lthis?=?(CserverDlg*)lpParameter;??
  • ????sockaddr_in?clientAddr?=?{0};??
  • ??
  • ????WSADATA?wsaData;??
  • ????WORD?sockVersion?=?MAKEWORD?(2,?0);??
  • ????::WSAStartup(sockVersion,?&wsaData);??
  • ??
  • ????lthis?->m_sSock?=?INVALID_SOCKET;??
  • ????lthis?->m_sSock?=?socket(AF_INET,?SOCK_STREAM,?IPPROTO_TCP);??
  • ????if?(lthis?->m_sSock?==?INVALID_SOCKET)??
  • ????{??
  • ????????AfxMessageBox("error");??
  • ????????::WSACleanup();??
  • ????????return?TRUE;??
  • ????}??
  • ??
  • ????sockaddr_in?ser;??
  • ????ser.sin_family?=?AF_INET;??
  • ????ser.sin_port?=?htons(8888);??
  • ????ser.sin_addr.S_un.S_addr?=?INADDR_ANY;??
  • ??
  • ????if?(::bind(lthis->m_sSock,?(LPSOCKADDR)&ser,?sizeof(ser))?==?SOCKET_ERROR)??
  • ????{??
  • ????????AfxMessageBox("error");??
  • ????????WSACleanup();??
  • ????????return?TRUE;??
  • ????}??
  • ??
  • ????if?(listen(lthis->m_sSock,?2)?==?SOCKET_ERROR)??
  • ????{??
  • ????????AfxMessageBox("error");??
  • ????????WSACleanup();??
  • ????????return?TRUE;??
  • ????}??
  • ??
  • ????int?nclientAddr?=?sizeof(clientAddr);??
  • ????lthis?->m_sClient?=?accept(lthis->m_sSock,?(SOCKADDR*)&clientAddr,?&nclientAddr);??
  • ????if?(lthis->m_sClient?==?INVALID_SOCKET)??
  • ????{??
  • ????????AfxMessageBox("error");??
  • ????????return?TRUE;??
  • ????}??
  • ??
  • ????while(TRUE)??
  • ????{??
  • ????????if?(lthis->Select_Server(lthis->m_sClient)?==?TRUE)??
  • ????????{??
  • ????????????TCHAR?recvMeg[1024]?=?{0};??
  • ??
  • ????????????int?re?=?recv(lthis->m_sClient,?(char*)recvMeg,?1024,?0);??
  • ????????????if?(re?>?0)??
  • ????????????{??
  • ????????????????recvMeg[re]?=?'\n';??
  • ????????????????lthis->recvMeg(recvMeg);??
  • ????????????}??
  • ????????????else??
  • ????????????{??
  • ????????????????lthis->recvMeg("客戶端下線");??
  • ????????????????break;??
  • ????????????}??
  • ????????}??
  • ????????Sleep(500);??
  • ????}??
  • ??
  • ????if?(lthis->m_sClient?!=?INVALID_SOCKET)??
  • ????{??
  • ????????closesocket(lthis->m_sClient);??
  • ????}??
  • ????if?(lthis->m_sSock?!=?INVALID_SOCKET)??
  • ????{??
  • ????????closesocket(lthis->m_sSock);??
  • ????}??
  • ??
  • ????WSACleanup();??
  • ????return?TRUE;??
  • }??

  • [cpp]?view plaincopy
  • static?UINT?__cdecl?ThreadProc(LPVOID?pParam);??
  • [cpp]?view plaincopy
  • UINT?CclientDlg::ThreadProc(LPVOID?pParam)??
  • {??
  • ????ASSERT(pParam);??
  • ????CclientDlg*?lthis?=?(CclientDlg*)pParam;??
  • ??
  • ??
  • ????WSADATA?wsaData;??
  • ????WORD?sockVersion?=?MAKEWORD(2,?0);??
  • ????::WSAStartup(sockVersion,?&wsaData);??
  • ??
  • ????lthis->m_Sock?=?INVALID_SOCKET;??
  • ????lthis->m_Sock?=?socket(AF_INET,?SOCK_STREAM,?IPPROTO_TCP);??
  • ????if?(lthis->m_Sock?==?INVALID_SOCKET)??
  • ????{??
  • ????????AfxMessageBox("error");??
  • ????????return?TRUE;??
  • ????}??
  • ??
  • ????sockaddr_in?serAdd;??
  • ????serAdd.sin_family?=?AF_INET;??
  • ????serAdd.sin_port?=?htons(8888);??
  • ????serAdd.sin_addr.S_un.S_addr?=?inet_addr("127.0.0.1");??
  • ??
  • ????if?(connect(lthis->m_Sock,?(sockaddr*)&serAdd,?sizeof(serAdd))?==?SOCKET_ERROR)??
  • ????{??
  • ????????AfxMessageBox("error");??
  • ????????return?TRUE;??
  • ????}??
  • ??
  • ??
  • ????while?(TRUE)??
  • ????{??
  • ??
  • ????????TCHAR?buff[1024]?=?{0};??
  • ????????if?(lthis->Select_Server(lthis->m_Sock))??
  • ????????{??
  • ????????????int?nrecv;??
  • ????????????nrecv?=?recv(lthis->m_Sock,?buff,?1024,?0);??
  • ????????????if?(nrecv?>?0)??
  • ????????????{??
  • ????????????????buff[nrecv]?=?'\n';??
  • ????????????????lthis->recvMeg(buff);??
  • ????????????}??
  • ????????????else??
  • ????????????{??
  • ????????????????lthis->recvMeg("服務(wù)器終止");??
  • ????????????????break;??
  • ????????????}??
  • ??
  • ????????}??
  • ????????Sleep(500);??
  • ????}??
  • ??
  • ????if?(lthis->m_Sock?!=?INVALID_SOCKET)??
  • ????{??
  • ????????closesocket(lthis->m_Sock);??
  • ????}??
  • ??
  • ????WSACleanup();??
  • ????return?TRUE;??
  • }??

  • 發(fā)送信息:

    [cpp]?view plaincopy
  • void?CserverDlg::OnBnClickedButsend()??
  • {??
  • ????//?TODO:?在此添加控件通知處理程序代碼??
  • ????CString?strsend;??
  • ????ASSERT(m_sClient?!=?INVALID_SOCKET);??
  • ????GetDlgItemText(IDC_SEND,?strsend);??
  • ????if?(!strsend.IsEmpty()?&&?Select_Server(m_sClient,?100,?FALSE))??
  • ????{??
  • ????????send(m_sClient,?strsend,?strlen(strsend),?0);??
  • ????????SetDlgItemText(IDC_SEND,?"");??
  • ????}??
  • ??
  • }??


  • 完整代碼下載


    2012/8/28

    jofranks 于南昌

    版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。

    總結(jié)

    以上是生活随笔為你收集整理的【网络编程】之七、select聊天室的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。