實驗六_select服務(wù)器_第1頁
實驗六_select服務(wù)器_第2頁
實驗六_select服務(wù)器_第3頁
實驗六_select服務(wù)器_第4頁
實驗六_select服務(wù)器_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、實驗六 基于套接口復(fù)用的聊天室系統(tǒng)內(nèi)容:建立一個容納63個客戶的聊天室。流程:1. 客戶端連接上聊天室服務(wù)器;2. 服務(wù)器把從一個客戶端收到的數(shù)據(jù)轉(zhuǎn)發(fā)給其它所有的客戶端;3. 客戶端顯示從服務(wù)器接收的數(shù)據(jù)服務(wù)器的流程如下BEGINWhile(1)把監(jiān)聽套接口和所有已連接套接口放入到查詢集合rset中;調(diào)用select()函數(shù)對rset中的套接口進行可讀性查詢;if(監(jiān)聽套接口有數(shù)據(jù)可讀)調(diào)用accept()函數(shù)來接受新客戶的連接;把新建立的已連接套接口放入到下一次查詢的rset中;對每一個(for each)有數(shù)據(jù)可讀的已連接套接口調(diào)用recv()函數(shù)來接收數(shù)據(jù);if(客戶端斷開連接)把該套接

2、口從下一次查詢的rset中清除掉;跳轉(zhuǎn)到下一個有數(shù)據(jù)可讀的已連接套接口繼續(xù)處理(continue);把該套接口上接收到的數(shù)據(jù),轉(zhuǎn)發(fā)給其它已連接套接口; / for each end/while(1) endEND客戶端的框架如下:/* 使用多線程的TCP聊天客戶端程序邏輯結(jié)構(gòu) */void _cdecl get_keyboard_input(void * param)SOCKET sock = (SOCKET) param;While(1)char info1024;gets(info);send(sock, info, strlen(info), 0);int main()SOCKET so

3、ck=socket();connect(sock,);_beginthread(get_keyboard_input, 0, (void *)sock); /啟動線程處理鍵盤輸入while(1)recv(sock, ); /主線程負責(zé)處理接收服務(wù)器的數(shù)據(jù)printf();要求:服務(wù)器的固定端口號為27015;TCP用套接口的復(fù)用來實現(xiàn),有興趣的同學(xué)可以考慮實現(xiàn)基于UDP的程序;客戶端使用多線程來處理鍵盤的輸入和服務(wù)器數(shù)據(jù)的接收。服務(wù)器/ C1.cpp : 定義控制臺應(yīng)用程序的入口點。/ C1.cpp : 定義控制臺應(yīng)用程序的入口點。/#include stdafx.h#include#prag

4、ma comment(lib,ws2_32.lib)int _tmain(int argc, _TCHAR* argv)int i;WSADATA wsaData;int err = WSAStartup(MAKEWORD(2,2),&wsaData);if(0 != err)return -1;SOCKET sock;sock = socket(AF_INET,SOCK_STREAM,0);if(sock = INVALID_SOCKET)WSACleanup();return -1;sockaddr_in server;server.sin_family = AF_INET;server.

5、sin_port = htons(27015);server.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(sock,(SOCKADDR*)&server,sizeof(server) = SOCKET_ERROR)closesocket(sock);WSACleanup();return -1;if(listen(sock,1) = SOCKET_ERROR)closesocket(sock);WSACleanup();return -1;#define MAXC 63SOCKET clientMAXC;for( i=0;iMAXC;i+)clienti

6、 = INVALID_SOCKET;fd_set rset,allset;FD_ZERO(&allset);FD_SET(sock,&allset);#define MAXS 1024char bufMAXCMAXS;for(;)rset = allset;int ret = select(0,&rset,NULL,NULL,NULL);if(ret = SOCKET_ERROR)break;if(ret = 0)continue;if(FD_ISSET(sock,&rset)struct sockaddr_in cliaddr;int clilen = sizeof(cliaddr);SOC

7、KET sockconn = accept(sock,(sockaddr *)&cliaddr,&clilen);if(sockconn = INVALID_SOCKET)break;for(i = 0; iMAXC; i+)if(clienti = INVALID_SOCKET)clienti = sockconn;break;if(iMAXC)FD_SET(sockconn,&allset);elseprintf(客戶端太多n);closesocket(sockconn);for(i=0; iMAXC; i+)if(clienti != INVALID_SOCKET)& FD_ISSET(

8、clienti,&rset)memset(bufi,0,MAXS);int nbyte = recv(clienti,bufi,sizeof(bufi),0);if(strcmp(bufi,) = 0)printf(client%d退出,i);elseprintf(client%d發(fā)送:%s,i,buf);if(nbyte = SOCKET_ERROR)FD_CLR(clienti,&allset);closesocket(clienti);clienti = INVALID_SOCKET;continue;if(nbyte = 0)FD_CLR(clienti,&allset);closes

9、ocket(clienti);clienti =INVALID_SOCKET;continue;send(clienti,bufi,sizeof(bufi),0);closesocket(sock);WSACleanup();return 0;客戶端/ S1.cpp : 定義控制臺應(yīng)用程序的入口點。/#include stdafx.h#include #pragma comment(lib,ws2_32.lib)#include void _cdecl get_keyboard_input(void * param)SOCKET sock1 =(SOCKET)param;printf(輸入聊天

10、內(nèi)容:n);while(1)char info1024; fgets(info, sizeof(info), stdin); send(sock1,info,strlen(info),0);memset(info,0,1024);int _tmain(int argc, _TCHAR* argv) SOCKET sock;WSADATA wsaData;if (WSAStartup(MAKEWORD(2,1),&wsaData) /調(diào)用Windows Sockets DL0printf(Winsock無法初始化!n);WSACleanup();return 0;char dest_ip=10.3.121.96;/本機的地址struct sockaddr_in server;server.sin_family=AF_INET;server.sin_port=htons(27015); /server的監(jiān)聽端口server.sin_addr.s_addr = inet_addr(dest_ip); sock=socket(AF_INET,SOCK_STREAM,0);int err = connect(sock,(sockaddr *)&server,sizeof(server);if(SOCKET_ERROR = err)printf(連接錯誤);_beginth

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論