Windows-C語言構(gòu)建網(wǎng)絡(luò)聊天室_第1頁
Windows-C語言構(gòu)建網(wǎng)絡(luò)聊天室_第2頁
Windows-C語言構(gòu)建網(wǎng)絡(luò)聊天室_第3頁
Windows-C語言構(gòu)建網(wǎng)絡(luò)聊天室_第4頁
Windows-C語言構(gòu)建網(wǎng)絡(luò)聊天室_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)專心-專注-專業(yè)精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)Windows C語言構(gòu)建網(wǎng)絡(luò)聊天室利用C語言編寫Windows應(yīng)用程序有兩種方式:一種是Windows C編程方式,另一種是Visual C+編程方式。在一般情況下,Visual C+編程方式編寫的程序源代碼量小、開發(fā)時(shí)的工作量小、工作難度也較小,但編譯后的代碼量較大,運(yùn)行速度略低;而Windows C編程方式編寫的程序源代碼量雖然較大,但可執(zhí)行代碼效率高。隨著技術(shù)的進(jìn)步,Visual C+編程方式已被廣泛采用,但象網(wǎng)絡(luò)編程等一些對(duì)速度要求高、對(duì)硬件操作較多的程序,大

2、多數(shù)還是用Windows C編程方式開發(fā)的。另外,學(xué)習(xí)Windows C程序設(shè)計(jì),還有助于更深入地了解Windows的內(nèi)幕和Windows API?;镜木W(wǎng)絡(luò)編程都是建立在Winsock基礎(chǔ)上的。Winsock是90年代初,為了方便網(wǎng)絡(luò)編程,由Microsoft聯(lián)合了其他幾家公司共同制定的一套WINDOWS下的網(wǎng)絡(luò)編程接口,它是通過C語言的動(dòng)態(tài)鏈接庫方式提供給用戶及軟件開發(fā)者的,主要由winsock.h頭文件和動(dòng)態(tài)鏈接庫winsock.dll組成,目前有兩個(gè)版本:Winsock1.1和Winsock2.0。作為網(wǎng)絡(luò)編程接口,Winsock屏蔽了網(wǎng)絡(luò)底層的復(fù)雜的協(xié)議和數(shù)據(jù)結(jié)構(gòu),使得編程人員對(duì)網(wǎng)絡(luò)

3、的操作變得非常簡單,因此,在Win32平臺(tái)上,訪問眾多的基層網(wǎng)絡(luò)協(xié)議,Winsock是首選接口。用Winsock構(gòu)建一個(gè)網(wǎng)絡(luò)聊天室,有兩種基本的方式:數(shù)據(jù)報(bào)方式和流方式。面向無連接的數(shù)據(jù)報(bào)方式數(shù)據(jù)報(bào)方式又稱無連接方式,對(duì)應(yīng)的是UDP(User Datagram Protocol)協(xié)議。這種方式不提供數(shù)據(jù)無錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù)并且接收順序混亂,后發(fā)出的報(bào)文可能會(huì)先收到,并且報(bào)文的長度是有限制的;不過,由于取消了重發(fā)校驗(yàn)機(jī)制,能夠達(dá)到較高的通信速率,可以用于對(duì)數(shù)據(jù)可靠性要求不高的通信,如實(shí)時(shí)的語音、圖像傳送和廣播消息等。和C語言一樣,函數(shù)是Windows C編程的最基本的單位。不過,Wind

4、ows C主要使用API函數(shù),而網(wǎng)絡(luò)編程則主要使用Winsock提供的API函數(shù)。數(shù)據(jù)方式構(gòu)建網(wǎng)絡(luò)聊天室主要使用了以下幾個(gè)函數(shù):1WSAStartup():初始化?!竞瘮?shù)原型】int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);【使用說明】每一個(gè)使用winsock的應(yīng)用程序,都必須進(jìn)行WSAStart函數(shù)調(diào)用,并且只有在調(diào)用成功之后才能使用其它的winsock網(wǎng)絡(luò)操作函數(shù)。返回值:調(diào)用成功返回0;否則,返回出錯(cuò)信息。WversionRequired:表示欲使用的insock版本,這是一個(gè)WORD類型的整數(shù),

5、它的高位字節(jié)定義的是次版本號(hào),低位字節(jié)定義的是主版本號(hào)。LpWSAData:是一個(gè)指向WSADATA資料的指針。這個(gè)資料我們一般不使用。2Socket():創(chuàng)建一個(gè)Socket。【函數(shù)原型】SOCKET socket(int af,int type,int proctocol);【使用說明】Winsock網(wǎng)絡(luò)通信的第一步通常就是調(diào)用這個(gè)函數(shù)。所有的通信在建立之前都有要?jiǎng)?chuàng)建一個(gè)Socket。該函數(shù)的功能與文件操作中的fopen()類似,返回值是由Winsock定義的一種數(shù)據(jù)類型SOCKET,它實(shí)際是一個(gè)整型數(shù)據(jù),是Socket創(chuàng)建成功時(shí),Windows分配給程序的Socket編號(hào),后面調(diào)用傳輸函

6、數(shù)時(shí),可以把它像文件指針樣引用。如果Socket建立失敗,返回值WIVALID_SOCKET。Af:指address family(地址族),一般都填A(yù)F_INET,表示是在Internet上的Socket;Type::是Socket的類型,當(dāng)采用流連接方式時(shí),用SOCK_STREAM;采用數(shù)據(jù)報(bào)文方式時(shí),用SOCK_DGRAM。Proctocol:一般都有為0,表示對(duì)兩種類型的Socket分別采用缺省的TCP和UDP傳輸協(xié)議。3Bind():為創(chuàng)建Socket指定通信對(duì)象?!竞瘮?shù)原型】int bind ( SOCKET s, const struct sockaddr FAR* name,

7、int namelen );【使用說明】成功創(chuàng)建了Socket之后,就應(yīng)該選定通信的對(duì)象。首先是自己的程序要與網(wǎng)上的哪臺(tái)計(jì)算機(jī)通話;其次,在多任務(wù)的系統(tǒng)下,該臺(tái)計(jì)算機(jī)上可能會(huì)有幾個(gè)程序在工作,必須指出要與哪個(gè)程序通信。前者可以通過IP地址來確定,而后者則由端口號(hào)來確定的。一臺(tái)計(jì)算機(jī)有65536個(gè)端口,端口號(hào)范圍為065535,不同的通信程序使用不同的端口。不過,1024以下的端口號(hào)一般都已被一些常用的網(wǎng)絡(luò)服務(wù)程序所占用,因此,編制自己的通信程序時(shí),指定的端口號(hào)應(yīng)大于1024。s:上一步創(chuàng)建Socket時(shí)創(chuàng)建好的套接字。name:是指向描述通信對(duì)象地址信息的結(jié)構(gòu)體strict sockaddr_

8、in的指針。namelen:name結(jié)構(gòu)體的長度。Sockaddr_in的定義如下:struct sockaddr_in short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero8;其中,sin_family是指一套地址族,它指定所要使用的通信協(xié)議,通常設(shè)為AF_INET;sin_port端口號(hào);sin_addr是IP地址;而sin_zero8的作用,只是使該結(jié)構(gòu)的大小和SOCKADDR結(jié)構(gòu)大小相同。IP地址sin_addr結(jié)構(gòu)定義如下:struct in_addr union struc

9、t u_char s_b1,s_b2,s_b3,s_b4; S_un_b; struct u_short s_w1,s_w2; S_un_w; u_long S_addr; S_un;這樣,對(duì)于一個(gè)IP地址,例如“”,你可以用以下三種方法賦給一個(gè)sockaddr結(jié)構(gòu)體(例如struct sockaddr_in m_addr;):方法1:m_addr.sin_addr.S_un.S_un_b.s_b1=192;m_addr.sin_addr.S_un.S_un_b.s_b2=168;m_addr.sin_addr.S_un.S_un_b.s_b3=0;m_addr.sin_addr.S_un.S

10、_un_b.s_b4=1;方法2:m_addr.sin_addr.S_un.S_un_w.s_w1=(1688)|192;m_addr.sin_addr.S_un.S_un_w.s_w2=(18)|0;方法3:m_addr.sin_addr.S_un.S_addr=(124)|(016)|(1688)|192;為了更方便地賦值,winsock還為我們提供了一個(gè)函數(shù)inet_addr(),可以把用字符串表示的IP地址“”直接賦給結(jié)構(gòu)體m_addr:char * IP_String=”;m_addr.sin_addr.S_un.S_addr=inet_addr(IP_String);4recvfr

11、om()/sendto():【函數(shù)原型】int recvfrom ( SOCKET s,char FAR* buf, int len,int flags,struct sockaddr FAR* from, int FAR* fromlen );int sendto (SOCKET s,const char FAR * buf, int len, int flags,const struct sockaddr FAR * to, int tolen);【使用說明】s:是連接用的socket。buf、len:發(fā)送或接收的數(shù)據(jù)包字符串的地址和長度。flags:一般取0。from、fromlen/t

12、o、tolen:含義和用法與bind()中的相同,分別表示接收和發(fā)送數(shù)據(jù)的對(duì)象。5Closesocket():【函數(shù)原型】int closesocket ( SOCKET s);【使用說明】和關(guān)閉文件操作一樣,socketd在使用以后,也要關(guān)閉。Internet上的聊天室程序一般都是Client/Server結(jié)構(gòu)的,由服務(wù)器提供服務(wù)端連接響應(yīng),使用者通過客戶端程序登錄到服務(wù)器(面向接連的流方式),或直接向服務(wù)端發(fā)送報(bào)文(面向無連接的數(shù)據(jù)報(bào)方式)。相應(yīng)地,聊天室程序也就分為服務(wù)器端和客戶端兩部分。面向無連接的數(shù)據(jù)報(bào)方式的程序流程圖如圖1所示:調(diào)用socket()創(chuàng)建一個(gè)監(jiān)聽Socket調(diào)用bin

13、d()監(jiān)聽socket指定通訊對(duì)象調(diào)用recvfrom()和sendto()進(jìn)行通訊調(diào)用closesocket()關(guān)閉socket調(diào)用WSAStartup()初化Winsock調(diào)用WSAStartup()初化Winsock調(diào)用closesocket()關(guān)閉socket調(diào)用recvfrom()和sendto()進(jìn)行通訊調(diào)用socket()創(chuàng)建一個(gè)會(huì)話Socket服務(wù)器端客戶端 圖1面向無連接的數(shù)據(jù)報(bào)方式流程圖可以為服務(wù)器端和客戶端分別建立如圖1、圖2所示對(duì)話框: 圖1服務(wù)器端 圖2客戶端相應(yīng)的源程序見附件中的源程序Chat_Room1。二、面向連接的流方式流方式又稱無連接方式,對(duì)應(yīng)的是TCP(T

14、ransport Control Protocol)協(xié)議。在這種方式下,兩個(gè)通信的應(yīng)用程序之間先要建立一種連接鏈路,確定了這條鏈路之后,數(shù)據(jù)才能被正確接收和發(fā)送。流方式的特點(diǎn)是通信可靠,對(duì)數(shù)據(jù)有校驗(yàn)和重發(fā)的機(jī)制,通常用來做數(shù)據(jù)文件的傳輸如FTP、Telnet等。這種方式主要使用了以下幾個(gè)函數(shù):1Connect():【函數(shù)原型】int connect ( SOCKET s, const struct sockaddr FAR* name, int namelen);【使用說明】與通信對(duì)象建立連接,主要用在客戶端。其中s、name和namelen的含義與使用方法和bind()相同。如果連接失敗,該

15、函數(shù)會(huì)返回SOCKET_ERROR。2listen():【函數(shù)原型】int listen (SOCKET s,int backlog);【使用說明】對(duì)于服務(wù)器端程序,當(dāng)申請到Socket,并指定通信對(duì)象為INADDR_ANY之后,就應(yīng)該等待一個(gè)客戶端程序的連接。當(dāng)沒有連接請求時(shí),就進(jìn)入等待狀態(tài),直至有一個(gè)請求到達(dá)為止。其中:s:是socket()創(chuàng)建的socket。backlog:等待連接的隊(duì)列長度,可取15。如果當(dāng)某個(gè)客戶程序要求連接之時(shí),服務(wù)器已與其他客戶程序連接,則后來的連接請求會(huì)被放在隊(duì)列中,等待服務(wù)器空閑的時(shí)候再與之連接。當(dāng)隊(duì)列達(dá)到指定長度(backlog的值)時(shí),再來的連接請求都將

16、被拒絕。3accept():【函數(shù)原型】SOCKET accept (SOCKET s,struct sockaddr FAR* addr,int FAR* addrlen);【使用說明】對(duì)與服務(wù)器端程序,在接收到一個(gè)連接請求之后,要為這個(gè)連接建立一個(gè)新的socket,這個(gè)任務(wù)由accept()函數(shù)來完成,并把它作為返回值。新建的Socket與原來的Socket有相同的特性,包括端口號(hào)。原來的Socket用于繼續(xù)等待其他的連接請求,而新生成的Socket才是與客戶端進(jìn)行通信的實(shí)際Socket。一般將參數(shù)中的SOCKET稱做“監(jiān)聽”Socket,它只負(fù)責(zé)接受連接,不負(fù)責(zé)通話;而accept返回的

17、SOCKET則稱為“會(huì)話”Socket,它只負(fù)責(zé)與客戶端通話。參數(shù)中的指針addr和addrlen用來返回客戶機(jī)的sockaddr_in結(jié)構(gòu)體,通過addr可得到客戶機(jī)的IP地址和連接端口。使用方法則與bind()中的name和namelen相同。4recv()/send():【函數(shù)原型】建立連接后,用來接收和發(fā)送數(shù)據(jù)。其中:s:是連接用的socket。buf、len和flags的含義與作用方法與recvfrom()/connect()中的相同,分別表示接收和發(fā)送的數(shù)據(jù)包字符串的地址、長度和標(biāo)志。 面向無連接的數(shù)據(jù)報(bào)方式的程序流程圖如圖1所示:調(diào)用WSAStartup()初化Winsock調(diào)用

18、socket()創(chuàng)建一個(gè)監(jiān)聽Socket調(diào)用bind()為監(jiān)聽Socket指定通訊對(duì)象調(diào)用listen()設(shè)置等待連接狀態(tài)調(diào)用accept()接收連接并生成會(huì)話socket調(diào)用send()和recv()進(jìn)行對(duì)話調(diào)用closesocket()關(guān)閉socket調(diào)用WSAStartup()初化Winsock調(diào)用socket()創(chuàng)建一個(gè)會(huì)話Socket調(diào)用connect()與服務(wù)器端連接調(diào)用send()和recv()進(jìn)行對(duì)話調(diào)用closesocket()關(guān)閉socket阻塞,等待用戶連接阻塞,等待用戶發(fā)送數(shù)據(jù)服務(wù)器端客戶端圖2面向連接的流方式流程圖分別為服務(wù)器端和客戶端建立如圖3、圖4所示對(duì)話框: 圖

19、3 圖4這是一個(gè)單方向傳送的面向連接的的流方式聊天程序,源程序附在附件源程序Chat_Room2中,源代碼比較簡單,就不在這里另作說明了。三、面向連接的異步模式在上面的流方式中,函數(shù)listen()要等到有客房端的連接請求或是出錯(cuò)時(shí)才能返回;recv()函數(shù)也要等到有數(shù)據(jù)發(fā)送過來的時(shí)候或是出錯(cuò)的時(shí)候才能返回。這時(shí),如果網(wǎng)絡(luò)擁擠或一次發(fā)送的數(shù)據(jù)量過大,交換的數(shù)據(jù)不能在短時(shí)間內(nèi)傳送完, 收發(fā)數(shù)據(jù)的函數(shù)就因此不能返回,我們把這種現(xiàn)象叫做阻塞。在阻塞期間,除了等待網(wǎng)絡(luò)操作完成不能進(jìn)行任何操作。為了解決這一問題,Winsock為我們提供了一種異步模式,在這種模式中,函數(shù)在被調(diào)用后立即返回,Winsock

20、通過函數(shù)WSAAsyncSelect()來實(shí)現(xiàn)非阻塞通信。方法是,由該函數(shù)指定某種網(wǎng)絡(luò)事件(如有數(shù)據(jù)到達(dá)、可以發(fā)送數(shù)據(jù)、有程序請求連接等),當(dāng)被子指定的網(wǎng)絡(luò)事件發(fā)生時(shí),由Winsock發(fā)送由程序事先約定的消息。程序中就可以根據(jù)這些消息做出相應(yīng)的處理。WSAAsyncSelect(),它的原型是:int WSAAsyncSelect (SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent);Socket在這個(gè)函數(shù)調(diào)用中被自動(dòng)設(shè)成非阻塞方式,hWnd是接收Winsock消息的窗口句柄,wMsg是向窗口發(fā)出的消息名稱,用戶可以任意定義。LEvent是被指定

21、的網(wǎng)絡(luò)事件,如下表所示:網(wǎng)絡(luò)事件lEvent值說明FD_READ希望Socket收到數(shù)據(jù)時(shí)發(fā)送讀的消息FD_WRITE希望Socket發(fā)送數(shù)據(jù)時(shí)發(fā)送寫的消息FD_OOB希望OOB data到達(dá)時(shí)發(fā)送到達(dá)的消息FD_ACCEPT希望有連接到來時(shí)發(fā)送連接請求的消息FD_CONNECT希望完成連接時(shí)發(fā)送連接完成的消息FD_CLOSE希望接收Socket關(guān)閉的消息FD_QOS希望接收Socket服務(wù)質(zhì)量(QoS)變化的消息FD_GROUP_QOS希望接收Socket服務(wù)質(zhì)量(QoS)不變的消息FD_ROUTING_INTERFACE_CHANGE希望接收指定的地址路由接口變化的消息FD_ADDRESS

22、_LIST_CHANGE希望接收Socket協(xié)議族局部地址變化的消息需要注意的是,WSAAsyncSelect()的設(shè)定是針對(duì)某一個(gè)Socket的,也就是說,只有當(dāng)被設(shè)定為異步模式的Socket事件發(fā)生時(shí),才會(huì)發(fā)送這些信息。如果開啟了很多Socket,而要讓每個(gè)Socket都變成異步模式,那么就必須對(duì)每一個(gè)Socket都呼叫WSAAsyncSelect()來一一設(shè)定。有了異步模式之后,可建立如下的服務(wù)器端和客戶端程序,對(duì)話框如圖5、圖6所示: 服務(wù)器端和客戶端程序分別為:Chat_RoomS.h#defineSER_MESSAGEWM_USER+100#define MaxNumber 5in

23、tWSA_return;WSADATAWSAData;SOCKETserver_hSocket;SOCKETListen_hSocket;struct sockaddr_inserver_addr;struct sockaddr_inListen_addr;int Listen_addrlen=sizeof(Listen_addr);intfromlen=sizeof(server_addr);BOOLserver_bErr;UINT server_uPort;char ShowText1024;charInputText256;charReceive_Text256;SOCKETnSocke

24、tMaxNumber;char*ClientIPMaxNumber;inti;charComeMsg30= 走進(jìn)聊天室rn;charLeaveMsg30= 離開聊天室rn;charLeaveMsg130= 異常離開rn;BOOL APIENTRY Hostname_ipDlgPro(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);Chat_RoomS.c#include#includeresource.h#includeChat_RoomS.hint APIENTRY WinMain(HINSTANCE hInstance,HINSTAN

25、CE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)DialogBox(hInstance,(LPCTSTR)DIALOG1,NULL,(DLGPROC)Hostname_ipDlgPro);return(TRUE);BOOL APIENTRY Hostname_ipDlgPro(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)switch(message)case WM_INITDIALOG:WSA_return=WSAStartup(0 x0002,&WSAData);if(WSA_return

26、!=0)MessageBox(NULL,初始化失??!,警告!,MB_OK);WSACleanup();return TRUE;case SER_MESSAGE:switch(lParam)case FD_ACCEPT:Listen_hSocket=accept(server_hSocket,(LPSOCKADDR)&Listen_addr,&Listen_addrlen);for(i=0;i0)MessageBox(NULL,異步模式創(chuàng)建失??!,警告!,MB_OK);ClientIPi=inet_ntoa(Listen_addr.sin_addr);break;if(iMaxNumber)st

27、rcat(ShowText,ClientIPi);strcat(ShowText,ComeMsg);SetDlgItemText(hDlg,IDC_SHOWTEXT,ShowText);for(i=0;iMaxNumber;i+)if(nSocketi!=0)send(nSocketi,ClientIPi,strlen(ClientIPi),0);send(nSocketi,ComeMsg,strlen(ComeMsg),0);return TRUE;case FD_READ:for(i=0;iMaxNumber;i+)if(nSocketi=wParam)recv(nSocketi,Rece

28、ive_Text,256,0);strcat(ShowText,ClientIPi);strcat(ShowText,:rn );strcat(ShowText,Receive_Text);SetDlgItemText(hDlg,IDC_SHOWTEXT,ShowText);for(i=0;iMaxNumber;i+)if(nSocketi!=0)send(nSocketi,ClientIPi,strlen(ClientIPi),0);send(nSocketi,:rn ,strlen(:rn ),0);send(nSocketi,Receive_Text,strlen(Receive_Tex

29、t),0);return TRUE;case FD_WRITE:return TRUE;case FD_CLOSE:for(i=0;iMaxNumber;i+)if(nSocketi=wParam)strcat(ShowText,ClientIPi);strcat(ShowText,LeaveMsg);SetDlgItemText(hDlg,IDC_SHOWTEXT,ShowText);closesocket(nSocketi);nSocketi=0;for(i=0;iMaxNumber;i+)if(nSocketi!=0)send(nSocketi,ClientIPi,strlen(Clie

30、ntIPi),0);send(nSocketi,LeaveMsg,strlen(LeaveMsg),0);return TRUE;default:for(i=0;iMaxNumber;i+)if(nSocketi=wParam)strcat(ShowText,ClientIPi);strcat(ShowText,LeaveMsg1);SetDlgItemText(hDlg,IDC_SHOWTEXT,ShowText);closesocket(nSocketi);nSocketi=0;for(i=0;i0)MessageBox(NULL,異步模式創(chuàng)建失敗!,警告!,MB_OK);break;se

31、rver_addr.sin_family=AF_INET;server_addr.sin_addr.S_un.S_addr=INADDR_ANY;server_uPort=GetDlgItemInt(hDlg,IDC_PORTUINT,&server_bErr,TRUE);server_addr.sin_port=htons(u_short)server_uPort);if(bind(server_hSocket,(LPSOCKADDR)&server_addr,sizeof(server_addr)=SOCKET_ERROR)MessageBox(NULL,綁定端口失?。?警告,MB_OK)

32、;break;if(listen(server_hSocket,5)=SOCKET_ERROR)MessageBox(NULL,偵聽失敗!,警告!,MB_OK);break;strcpy(ShowText,服務(wù)器建立成功!rn);SetDlgItemText(hDlg,IDC_SHOWTEXT,ShowText);return TRUE;case IDC_SHOWTEXT:if(HIWORD(wParam)=EN_CHANGE)if(strlen(ShowText)1024-256)strcpy(ShowText,);case IDC_INPUTTEXT:if(HIWORD(wParam)=E

33、N_CHANGE)GetDlgItemText(hDlg,IDC_INPUTTEXT,InputText,256);if(InputTextstrlen(InputText)-1=n)strcat(ShowText,管理員:rn );strcat(ShowText,InputText);SetDlgItemText(hDlg,IDC_SHOWTEXT,ShowText);for(i=0;iMaxNumber;i+)if(nSocketi!=0)send(nSocketi,管理員:rn ,strlen(管理員:rn ),0);send(nSocketi,InputText,strlen(Inpu

34、tText),0);strcpy(InputText,);SetDlgItemText(hDlg,IDC_INPUTTEXT,InputText);return TRUE;case IDCANCEL:WSAAsyncSelect(server_hSocket,hDlg,0,0);closesocket(server_hSocket);WSACleanup();EndDialog(hDlg,TRUE);return TRUE;return FALSE;Chat_RoomC.h#define CLI_MESSAGE WM_USER+200intlen;intWSA_return;WSADATAWS

35、AData;SOCKETclient_hSocket;struct sockaddr_inclient_addr;BOOLbErr;UINT client_uPort;char ClientIP20;char InputText256;charReceiveText256;charShowText1024;BOOL APIENTRY Hostname_ipDlgPro(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);Chat_RoomC.c#include#includeresource.h#includeChat_RoomC.hint

36、APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)DialogBox(hInstance,(LPCTSTR)DIALOG1,NULL,(DLGPROC)Hostname_ipDlgPro);return(TRUE);BOOL APIENTRY Hostname_ipDlgPro(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)switch(message)case WM_INITDIALOG:WSA_retur

37、n=WSAStartup(0 x0002,&WSAData);if(WSA_return!=0)MessageBox(NULL,初始化失?。?警告!,MB_OK);WSACleanup();return TRUE;case CLI_MESSAGE:switch(lParam)case FD_READ:len=recv(client_hSocket,ReceiveText,256,0);ReceiveTextlen=0;strcat(ShowText,ReceiveText);SetDlgItemText(hDlg,IDC_SHOWTEXT,ShowText);return TRUE;case

38、FD_WRITE:return TRUE;case FD_CLOSE:return TRUE;case FD_CONNECT:return TRUE;default:strcat(ShowText,網(wǎng)絡(luò)錯(cuò)誤,連接失敗!);SetDlgItemText(hDlg,IDC_SHOWTEXT,ShowText);closesocket(client_hSocket);return TRUE;case WM_COMMAND:switch(LOWORD(wParam)case IDC_IPADDRESS:if(HIWORD(wParam)=EN_CHANGE)GetDlgItemText(hDlg,IDC_IPADDRESS,ClientIP,20);break;case IDC_INPUTTEXT:if(HIWORD(wParam)=EN_CHANGE)GetDlgItemText(hDlg,IDC_INPUTTEXT,InputText,256);if(InputTextstrlen(InputText)-1=n)send(client_hSocket,InputText,256,0);strcpy(

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論