


下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、使用C/C+實現(xiàn)Socket聊天程序Initsock.h 文件/ initsock.h 文件#include <winsock2.h>#include <stdlib.h>#include <conio.h>#include <stdio.h>#pragma comment(lib, "WS2_32"> / 鏈接到 WS2_32.libclass CInitSockpublic:CInitSock(BYTE minorVer = 2, BYTE majorVer = 2>/ 初始化 WS2_32.dllWSADAT
2、A wsaData 。WORD sockV ersion = MAKEWORD(minorVer, majorVer> 。 if(:WSAStartup(sockV ersion, &wsaData> != 0>exit(0> 。CInitSock(>:WSACleanup(> 。TCP版TCPClient.cpp 文件/ TCPClient.cpp 文件/*使用說明0.運行程序前請查看是否將 initsock.h 文件引入到項目中。1首先修改聊天對方的IP地址2請首先運行服務(wù)端<TCPServer)程序,再運行客戶端 <TCPCIien
3、t)程序: 如配置正確服務(wù)端會收到相關(guān)連接信息。3連接成功后,需要由服務(wù)器端首先發(fā)起會話< 輸入消息并確認發(fā)送),客戶端收到消息后才能輸入消息并確認發(fā)送到服務(wù)器端。 并且雙方每次只能發(fā)送一條消息。如想發(fā)送第二條消息,需要等待該方成功 接受到另一方的消息后才能繼續(xù)輸入消息。*/#in elude "In itSock.h"#in clude <stdio.h>#include <iostream.h>CInitSock initSock 。 / 初始化 Winsock 庫int main(>/ 創(chuàng)建套節(jié)字SOCKET s = :socket
4、(AF_INET, SOCK_STREAM, IPPROTO_TCP> 。 if(s = INV ALID_SOCKET>printf(" Failed socket(> n"> 。return 0 。/ 也可以在這里調(diào)用 bind 函數(shù)綁定一個本地地址/ 否則系統(tǒng)將會自動安排/ 填寫遠程地址信息sockaddr_in servAddr 。servAddr.sin_family = AF_INET 。servAddr.sin_port = htons(4567> 。/注意,這里要填寫服務(wù)器程序<TCPServer程序)所在機器的IP地址/
5、 如果你的計算機沒有聯(lián)網(wǎng),直接使用即可servAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.129"> 。if(:connect(s, (sockaddr*>&servAddr, sizeof(servAddr>> = -1>printf(" Failed connect(> n"> 。return 0 。char buff256 。char szText256 。while(TRUE>/從服務(wù)器端接收數(shù)據(jù)int nRecv = :recv(s,
6、buff, 256, 0> 。if(nRecv > 0>buffnRecv = '0' 。printf(" 接收到數(shù)據(jù): %sn", buff> 。/ 向服務(wù)器端發(fā)送數(shù)據(jù)cin>>szText 。szText255 = '0' 。:send(s, szText, strlen(szText>, 0> 。/ 關(guān)閉套節(jié)字:closesocket(s> 。return 0 。TCPServer.cpp 文件/ TCPServer.cpp 文件/*使用說明0.運行程序前請查看是否將 initsoc
7、k.h 文件引入到項目中。1. 首先修改聊天對方的IP地址2. 請首先運行服務(wù)端<TCPServer)程序,再運行客戶端<TCPCIient)程序: 如配置正確服務(wù)端會收到相關(guān)連接信息。3. 連接成功后,需要由服務(wù)器端首先發(fā)起會話<輸入消息并確認發(fā)送) ,客戶端收到消息后才能輸入消息并確認發(fā)送到服務(wù)器端。 并且雙方每次只能發(fā)送一條消息。如想發(fā)送第二條消息,需要等待該方成功 接受到另一方的消息后才能繼續(xù)輸入消息。*/#incIude "InitSock.h"#incIude <stdio.h>#incIude <iostream.h>
8、Clni tSock ini tSock。/ 初始化 Win sock 庫int main(>/ 創(chuàng)建套節(jié)字SOCKET sListen = :socket(AF_INET, SOCK_STREAM, IPPROTO_TCP> 。if(sListen = INV ALID_SOCKET>printf("FaiIed socket(> n"> 。return 0 。/ 填充 sockaddr_in結(jié)構(gòu)sockaddr_in sin 。sin.sin_famiIy = AF_INET 。sin.sin_port = htons(4567> 。
9、sin.sin_addr.S_un.S_addr = INADDR_ANY 。/ 綁定這個套節(jié)字到一個本地地址if(:bind(sListen, (LPSOCKADDR>&sin, sizeof(sin>> = SOCKET_ERROR>printf("FaiIed bind(> n"> 。return 0 。/ 進入監(jiān)聽模式if(:Iisten(sListen, 2> = SOCKET_ERROR>printf("FaiIed Iisten(> n"> 。return 0 。/ 循環(huán)接
10、受客戶的連接請求sockaddr_in remoteAddr 。int nAddrLen = sizeof(remoteAddr> 。SOCKET sClient = 0 。char szText = " TCP Server Demo! rn" 。while(sClient=0>/ 接受一個新連接sClient = :accept(sListen, (SOCKADDR*>&remoteAddr, &nAddrLen> if(sClient = INV ALID_SOCKET>printf("Failed accept
11、(>"> 。printf(" 接受到一個連接: %s rn", inet_ntoa(remoteAddr.sin_addr>> 。 continue 。while(TRUE>/ 向客戶端發(fā)送數(shù)據(jù)gets(szText> 。:send(sClient, szText, strlen(szText>, 0> 。/ 從客戶端接收數(shù)據(jù)char buff256 。int nRecv = :recv(sClient, buff, 256, 0> 。if(nRecv > 0>buffnRecv = '0&
12、#39; 。printf(" 接收到數(shù)據(jù): %sn", buff> 。/ 關(guān)閉同客戶端的連接:closesocket(sClient> 。/ 關(guān)閉監(jiān)聽套節(jié)字:closesocket(sListen> 。return 0 。UDP版/ Chat.cpp : Defines the entry point for the console application./*使用說明0.運行程序前請查看是否將initsock.h文件引入到項目中。1首先修改聊天對方的IP地址2. 運行程序:如配置正確另一方會收到相關(guān)連接信息。3. 輸入消息:在每次輸入完欲發(fā)送的消息后,需
13、要連續(xù)敲擊兩次回車。4. 本程序有諸多缺陷:對用戶輸入的消息不能即時回顯到控制臺, 需要在敲擊兩次回車后回顯到屏幕。*/#include "stdafx.h"#include <iostream>#include <stdlib.h>#include <STDIO.H>#include <windows.h>#include "InitSock.h"using namespace std。CInitSock initSock 。/ 初始化 Winsock 庫DWORD receiverMark 。 /接收消
14、息者線程標識符DWORD senderMark 。 /發(fā)送者線程標識符/*定義信號量*/DWORD WINAPI Receiver(LPVOID> 。DWORD WINAPI Sender(LPVOID> 。/ 接收數(shù)據(jù)char buff1024 。sockaddr_in addr 。int nLen = sizeof(addr> 。SOCKET s 。int main(int argc, char *argv>/ 創(chuàng)建套節(jié)字s = :socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP>。/u_long iMode = 1 。/ioct
15、lsocket(s, FIONBIO, &iMode> 。if(s = INV ALID_SOCKET>printf("Failed socket(> n"> 。return 0 。/ 填充 sockaddr_in 結(jié)構(gòu)sockaddr_in sin 。sin.sin_family = AF_INET 。sin.sin_port = htons(4567> 。sin.sin_addr.S_un.S_addr = INADDR_ANY 。addr.sin_family = AF_INET 。addr.sin_port = htons(45
16、67> 。/注意,這里要填寫服務(wù)器程序所在機器的IP地址/ 如果你的計算機沒有聯(lián)網(wǎng),直接使用即可addr.sin_addr.S_un.S_addr = inet_addr("192.168.1.129"> 。 / 綁定這個套節(jié)字到一個本地地址if(:bind(s, (LPSOCKADDR>&sin, sizeof(sin>> = SOCKET_ERROR>printf("Failed bind(> n"> 。 return 0 。/ 發(fā)送數(shù)據(jù) char szText = "PC 請求連接
17、. rn" 。:sendto(s, szText, strlen(szText>, 0, (sockaddr*>&addr, sizeof(addr>> 。 CreateThread(NULL,0,Receiver,NULL,0,&receiverMark> 。CreateThread(NULL,0,Sender,NULL,0,&senderMark> 。 bool isContinue = true 。while(isContinue>if(getche(>=96> / 按 后終止程序運行 isConti
18、nue = false 。system("PAUSE"> 。 return 0 。/*接收者*/DWORD WINAPI Receiver(LPVOID lpParam >while(1>int nRecv = :recvfrom(s, buff, 1024, 0, (sockaddr*>&addr, &nLen> 。 if(nRecv > 0>buffnRecv = '0' 。printf(" Received data(%s> : %sn", :inet_ntoa(add
19、r.sin_addr>, buff> 。 return 0 。/* *發(fā)送者*/DWORD WINAPI Sender(LPVOID lpPara>while(1>cout<<"Input your message: " 。/ 發(fā)送數(shù)據(jù)char text256 。cin>>text 。text255 = '0' 。cout<<text<<endl 。:sendto(s, text, strlen(text>, 0, (sockaddr*>&addr, sizeof(a
20、ddr>> 。return 0 。本文來自 CSDN 博客,轉(zhuǎn)載請標明出處:使用C/C+實現(xiàn)Socket聊天程序解決該問題的思路解決該問題的整體方案不外有二:<1)基于TCP的Socket連接;<2)基于UDP的Socket連接;但是,針對每種方案又各有很多具體的實現(xiàn)方法。在本次實驗中,我先后開發(fā)了基于TCP連接和UDP連接的Socket聊天程序。具體實現(xiàn)思路如下:<一) 基于TCP連接Socket聊天程序基于該連接的聊天程序需要至少具備一個服務(wù)器端<Server)和一個客戶端<Client )。在本程序中,一個用戶作為 Server端,另一個用戶作為
21、 Clie nt端。也就是說,作為Server端的用 戶,需要首先啟動程序,等待Clie nt端的連接請求。當(dāng)TCP連接握手以后,雙方方可進行交互。<注:在本程序中Server端并不是單獨存在。它也可以向他的Client端發(fā)送消息。)但是本程序?qū)崿F(xiàn)的交互功能十分簡單,具有很多限制。當(dāng)Client端與Server端握手以后,Server端需要首先發(fā)起會話;Clie nt端在收到消息后再回復(fù)一條消息給Server端;同樣,Server端在收到消息后再回復(fù)一條消息給Client端以此類推。并且,無論是 Server端還是Client端每次發(fā)送消息只能發(fā)送一條。造成交互操作具有諸多限制的主要原因
22、是,我在Server端和Client端使用了一個 While循環(huán),它們的偽代碼分別如下:Clie nt 端Server 端while(TRUE>從Server端接收消息向Server端發(fā)送消息while(TRUE>向Clie nt端發(fā)送消息從Clie nt端接收消息二) 基于UDP連接Socket聊天程序基于該連接的聊天程序不需要具備服務(wù)器端Server),每個客戶端Client)既是服務(wù)器端也是客戶端。也就是說每個 Clie nt端自身既可以自行接收其它用戶發(fā)來的消息,也可以向其 它Clie nt端發(fā)送消息,不需要事先與其他用戶進行握手連接。因為在默認情況下 Win Sock接口
23、的recvfrom(和sen dto(都會在被調(diào)用時阻塞當(dāng)前線程,也 就是說如果程序正在接受其他用戶發(fā)來的數(shù)據(jù),那么它就不能夠執(zhí)行發(fā)送數(shù)據(jù)的任務(wù),反 之相同。所以為解決該問題一般有以下幾種解決方案:采用Select模型、WSAAsyncSelect模型、WSAEventSelect 模型、重疊(Overlapped )模型和完成接口 Completion port)模型。在本程序中,因為我沒能在短時間內(nèi)學(xué)會上述方案中的任一種,因此采用了 多線程技術(shù)去實現(xiàn)消息接收和發(fā)送的同步問題。也就是說,在程序中創(chuàng)建兩個線程,一個 線程負責(zé)發(fā)送消息,另一個消息負責(zé)接受消息。兩個線程交替運行,從而達到同時收發(fā)消
24、 息的目的。當(dāng)然采用多線程方式解決消息收發(fā)同步問題可以移除上個程序中每個用戶一次 只能發(fā)送一條消息的限制。本周開發(fā)源代碼代碼的功能簡述使用C/C+實現(xiàn)Socket聊天程序:TCP版:服務(wù)器端用戶和客戶端用戶在成功連接后,其中一方通過控制臺輸入消息,依次 輪流向另一方發(fā)送數(shù)據(jù)。要求,服務(wù)器端首先發(fā)起會話,并且雙方每次只能發(fā)送一條消息。UDP版:任一端用戶通過指定IP地址將消息發(fā)送到另一端的用戶。交互雙方通過控制臺輸 入消息向另一方發(fā)送數(shù)據(jù)。沒有任何發(fā)送限制。開發(fā)的收獲理解了 TCP連接和UDP連接的基本原理和工作過程。復(fù)習(xí)了關(guān)于Windows多線程及進程同步的相關(guān)知識。開發(fā)中碰到的主要困難對于T
25、CP版:在考慮如何解決消息的收發(fā)同步問題上遇到了困難。最終使用了不佳方案:通過在服務(wù)器 端和客戶端分別運行while循環(huán)并依次進行數(shù)據(jù)收發(fā)工作的方式解決數(shù)據(jù)收發(fā)同步問題。對于UDP版: 同樣在考慮如何解決消息的收發(fā)同步問題上遇到了困難。但這次使用了多線程解決該問題 開發(fā)中未能解決的問題對于UDP版:為何第一次消息輸入完畢敲擊一次回車后,只有消息的第一個字符沒能發(fā)送出去,而其它 字符卻可以被成功發(fā)送出去?而且當(dāng)?shù)诙屋斎胂⑶没剀嚭笙⒕湍鼙蝗堪l(fā)送出去? 為何消息輸入完畢后需要按兩次回車鍵才能將消息發(fā)送到另一端?為什么輸入的消息不能即時回顯到發(fā)送者屏幕上?只有當(dāng)敲擊二次回車后用戶輸入的欲發(fā) 送
26、消息才會顯現(xiàn)出來?如何才能避免用戶在輸入消息的同時也能正常接收消息?也就是不至于打斷用戶已輸入的 消息的前提下,顯示接收到的消息。針對本周訓(xùn)練內(nèi)容自己設(shè)計的案例案例的主要功能 同代碼的功能簡述 用到的基本知識相關(guān)Win sock編程接口; TCP連接和UDP連接基本工作原理;Win dows多線程;進程同步程序注意了哪些規(guī)范代碼格式、常量的定義、函數(shù)的聲明你進行了哪些測試略程序進行了哪些有效性檢查略你是如何保證程序的高效率的略本文來自 CSDN 博客,轉(zhuǎn)載請標明出處:北航軟件學(xué)院一級實踐實驗報告學(xué)號: GS0821594 姓名:葉現(xiàn)一 第 13 周 內(nèi)容訓(xùn)練使用C/C+實現(xiàn)Socket聊天程序
27、解決該問題的思路解決該問題的整體方案不外有二:1)基于TCP的Socket連接;2)基于UDP的Socket連接;但是,針對每種方案又各有很多具體的實現(xiàn)方法。在本次實驗中,我先后開發(fā)了基于TCP連接和UDP連接的Socket聊天程序。具體實現(xiàn)思路如下:一) 基于TCP連接Socket聊天程序基于該連接的聊天程序需要至少具備一個服務(wù)器端Server)和一個客戶端Client )。在本程序中,一個用戶作為 Server端,另一個用戶作為 Clie nt端。也就是說,作為Server端的用 戶,需要首先啟動程序,等待Clie nt端的連接請求。當(dāng)TCP連接握手以后,雙方方可進行交互。注:在本程序中S
28、erver端并不是單獨存在。它也可以向他的Client端發(fā)送消息。)但是本程序?qū)崿F(xiàn)的交互功能十分簡單,具有很多限制。當(dāng)Client端與Server端握手以后,Server端需要首先發(fā)起會話;Clie nt端在收到消息后再回復(fù)一條消息給Server端;同樣,Server端在收到消息后再回復(fù)一條消息給Client端以此類推。并且,無論是 Server端還是Client端 每次發(fā)送消息只能發(fā)送一條。造成交互操作具有諸多限制的主要原因是,我在Server端和Client端使用了一個 While循環(huán),它們的偽代碼分別如下:Clie nt 端Server 端while(TRUE從Server端接收消息向S
29、erver端發(fā)送消息while(TRUE>向Clie nt端發(fā)送消息從Clie nt端接收消息二) 基于UDP連接Socket聊天程序基于該連接的聊天程序不需要具備服務(wù)器端Server),每個客戶端Client)既是服務(wù)器端也是客戶端。也就是說每個 Clie nt端自身既可以自行接收其它用戶發(fā)來的消息,也可以向其 它Clie nt端發(fā)送消息,不需要事先與其他用戶進行握手連接。因為在默認情況下 Win Sock接口的recvfrom(和sen dto(都會在被調(diào)用時阻塞當(dāng)前線程,也 就是說如果程序正在接受其他用戶發(fā)來的數(shù)據(jù),那么它就不能夠執(zhí)行發(fā)送數(shù)據(jù)的任務(wù),反 之相同。所以為解決該問題一般
30、有以下幾種解決方案:采用Select模型、WSAAsyncSelect模型、WSAEventSelect 模型、重疊(Overlapped )模型和完成接口 Completion port)模型。在本程序中,因為我沒能在短時間內(nèi)學(xué)會上述方案中的任一種,因此采用了 多線程技術(shù)去實現(xiàn)消息接收和發(fā)送的同步問題。也就是說,在程序中創(chuàng)建兩個線程,一個 線程負責(zé)發(fā)送消息,另一個消息負責(zé)接受消息。兩個線程交替運行,從而達到同時收發(fā)消 息的目的。當(dāng)然采用多線程方式解決消息收發(fā)同步問題可以移除上個程序中每個用戶一次 只能發(fā)送一條消息的限制。本周開發(fā)源代碼代碼的功能簡述使用C/C+實現(xiàn)Socket聊天程序:TCP
31、版:服務(wù)器端用戶和客戶端用戶在成功連接后,其中一方通過控制臺輸入消息,依次輪流向另一方發(fā)送數(shù)據(jù)。要求,服務(wù)器端首先發(fā)起會話,并且雙方每次只能發(fā)送一條消息UDP版:任一端用戶通過指定IP地址將消息發(fā)送到另一端的用戶。交互雙方通過控制臺輸 入消息向另一方發(fā)送數(shù)據(jù)。沒有任何發(fā)送限制。開發(fā)的收獲理解了 TCP連接和UDP連接的基本原理和工作過程。復(fù)習(xí)了關(guān)于Windows多線程及進程同步的相關(guān)知識。 開發(fā)中碰到的主要困難對于TCP版:在考慮如何解決消息的收發(fā)同步問題上遇到了困難。最終使用了不佳方案:通過在服務(wù)器 端和客戶端分別運行while循環(huán)并依次進行數(shù)據(jù)收發(fā)工作的方式解決數(shù)據(jù)收發(fā)同步問題。 對于UD
32、P版:同樣在考慮如何解決消息的收發(fā)同步問題上遇到了困難。但這次使用了多線程解決該問題開發(fā)中未能解決的問題對于UDP版:為何第一次消息輸入完畢敲擊一次回車后,只有消息的第一個字符沒能發(fā)送出去,而其它 字符卻可以被成功發(fā)送出去?而且當(dāng)?shù)诙屋斎胂⑶没剀嚭笙⒕湍鼙蝗堪l(fā)送出去? 為何消息輸入完畢后需要按兩次回車鍵才能將消息發(fā)送到另一端?為什么輸入的消息不能即時回顯到發(fā)送者屏幕上?只有當(dāng)敲擊二次回車后用戶輸入的欲發(fā) 送消息才會顯現(xiàn)出來?如何才能避免用戶在輸入消息的同時也能正常接收消息?也就是不至于打斷用戶已輸入的消息的前提下,顯示接收到的消息。針對本周訓(xùn)練內(nèi)容自己設(shè)計的案例案例的主要功能同代碼的功
33、能簡述用到的基本知識相關(guān)Win sock編程接口; TCP連接和UDP連接基本工作原理;Win dows多線程;進程同步程序注意了哪些規(guī)范 代碼格式、常量的定義、函數(shù)的聲明 你進行了哪些測試略程序進行了哪些有效性檢查略你是如何保證程序的高效率的略 注意:實驗報告和案例源代碼須在本次小組討論會前提交 本文來自 CSDN 博客,轉(zhuǎn)載請標明出處:clipboardprint?comment(lib,"ws2_32.lib">#include<winsock2.h>viewplaincopyto#pragma#include<string>usingn
34、amespacestd 。stringstrCurMsg=""。voidrecvProc(SOCKETsockConnect>。charmsgRcv100=0while(true>#include<iostream>if(SOCKET_ERROR=recv(sockConnect,msgRcv,sizeof(msgRcv>,0>>cout<<"nHeisleaving"returnif(msgRcv0!= ''>strCurMsg.erase(strCurMsg.end(>
35、-7,strCurMsg.end(>>strCurMsg+="He said:strCurMsg+=msgRcvstrCurMsg+='n'IIstrCurMsg+="input:system("cls">cout<<strCurMsgintmain(intargc,char* argv>WORDWSADA TAwVersionRequestedwsaDatawVersionRequestederr = WSAStartup( (ifintMAKEWORD( wVersionRequested, !=e
36、rrreturnif(HIBYTE(LOBYTE(wsaData.wVersionwsaData.wVersionerr1,&wsaData!=o1|WSACleanup(returnSOCKET sockSrv=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP>sockaddr_in addrSrv memset(&addrSrv,0,sizeof(addrSrv>>addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY>。addrSrv.sin_family=AF_INET。addrSr
37、v.sin_port=htons(5000>。if(bind(sockSrv,(sockaddr*>&addrSrv,sizeof(sockaddr>>=SOCKET_ERROR> cout<<"bind error"<<endl 。 if(listen(sockSrv,5>=SOCKET_ERROR> cout<<"listenerror"<<endl。 SOCKADDR_IN addrClient。int len=sizeof(sockaddr>
38、。 while(true> cout<<"Waiting " 。SOCKET sockConnect=accept(sockSrv,(sockaddr*>&addrClient,&len> 。if(sockConnect=INV ALID_SOCKET>cout<<"invalidsocket"<<endl 。return0。elsecout<<"Heiscomingn" 。CreateThread(NULL,0,(LPTHREAD_START_R
39、OUTINE>recvProc,(void*>sockConnect,0,NULL> 。 while(true> char buf100=0 。 strCurMsg+="input: "。system("cls">。cout<<strCurMsg。cin.getline(buf,100>。strCurMsg.erase(strCurMsg.end(>-7,strCurMsg.end(>>。strCurMsg+="Yousaid:"。strCurMsg+=buf。strC
40、urMsg+= 'n'。send(sockConnect,buf,sizeof(buf>,0>。 closesocket(sockConnect>。WSACleanup(>return#pragma0。 comment(lib,"ws2_32.lib"> #include<winsock2.h> #include<iostream>#include<string> using namespace std 。 string strCurMsg="" 。 void recvPr
41、oc(SOCKET sockConnect> char msgRcv100=0 。 while(true> if(SOCKET_ERROR=recv(sockConnect,msgRcv,sizeof(msgRcv>,0>> cout<<"nHe is leaving" 。 return 。 if(msgRcv0!= ''>strCurMsg.erase(strCurMsg.end(>-7,strCurMsg.end(>>strCurMsg+="He said: "strC
42、urMsg+=msgRcvstrCurMsg+='n'IIstrCurMsg+="input:system("cls">cout<<strCurMsgintmain(intargc,char* argv>WORDWSADA TAwVersionRequestedwsaDatawVersionRequestederr = WSAStartup( (ifintMAKEWORD( wVersionRequested, err !=err1,&wsaDatareturnif(HIBYTE(LOBYTE(wsaData.wVe
43、rsionWSACleanup(returnwsaData.wVersion!=1|cout<<"listenintlen=sizeof(sockaddr>SOCKETwhile(true>cout<<"WaitingsockConnect=accept(sockSrv,(sockaddr*>&addrClient,&len>if(sockConnect=INV ALID_SOCKET>IIcout<<"invalidreturnsocket"<<endl0el
44、secout<<"Heiscomingn"SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP>。sockaddr_in addrSrv 。 memset(&addrSrv,0,sizeof(addrSrv>>。addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY>。addrSrv.sin_family=AF_INET。addrSrv.sin_port=htons(5000>。if(bind(sockSrv,(sockaddr*>
45、;&addrSrv,sizeof(sockaddr>>=SOCKET_ERROR> cout<<"bind error"<<endl 。 if(listen(sockSrv,5>=SOCKET_ERROR> error"<<endl 。addrClientSOCKADDR_IN CreateThread(NULL,0, (LPTHREAD_START_ROUTINE>recvProc,(void*>sockConnect, 0,NULL>while(true>buf1
46、00=0IIcharstrCurMsg+="input:system("cls">cout<<strCurMsgcin.getline(buf,100> 。strCurMsg.erase(strCurMsg.end(>-7,strCurMsg.end(>>strCurMsg+="You said:" strCurMsg+=bufstrCurMsg+='n'send(sockConnect,buf,sizeof(buf>,0>closesocket(sockConnect>
47、;。 WSACleanup(>。return 0 。 全國計算機等級測試網(wǎng),加入收藏客戶端程序代碼: view plaincopy to clipboardprint?#pragma comment(lib,"ws2_32.lib"> #include<winsock2.h> #include<iostream> #include<string>usingnamespace std。stringstrCurMsg=""。voidrecvProc(SOCKETsockClient>。charmsgRcv
48、100=0while(true> if(SOCKET_ERROR=recv(sockClient,msgRcv,sizeof(msgRcv>,0>> cout<<"nHe is leaving" 。 return 。if(msgRcv0!= ''> strCurMsg.erase(strCurMsg.end(>-7,strCurMsg.end(>>。strCurMsg+="He said: " 。 strCurMsg+=msgRcv。strCurMsg+= 'n'
49、。strCurMsg+="input: " 。system("cls"> cout<<strCurMsgint main(intargc, char* argv>wVersionRequestedWORDWSADA TA intwVersionRequested wsaData errMAKEWORD(1, 1 >err = WSAStartup( wVersionRequested, &wsaData >if( err != return01>。1if (LOBYTE( wsaData.wVersion
50、>!=1|HIBYTE(wsaData.wVersion >!=1>WSACleanup(>。return1。SOCKET sockClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP> 。 SOCKADDR_IN addrSrv 。 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1">。addrSrv.sin_family=AF_INET。addrSrv.sin_port=htons(5000>。if (connect(sockClient,(
51、sockaddr*>&addrSrv,sizeof(sockaddr>> = SOCKET_ERROR> cout<<"connected failedn" 。 return 1 。 else cout<<"connect OKn" 。CreateThread(NULL,0, (LPTHREAD_START_ROUTINE>recvProc,(void*>sockClient, 0,NULL> 。while(true> char buf100=0 。 strCurMsg+="input: "。system("cls">。cout<<strCurMsg。cin.getline(buf,100>。strCurMsg.erase(strCurMsg.end(>-7,strCurMsg.end(>>。strCurMsg+="Yousaid:"。strCurMsg+=buf。strCurMsg+= 'n&
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 傳統(tǒng)紡織工藝研究:手工印染技術(shù)的歷史傳承與創(chuàng)新應(yīng)用
- 民警打分具體管理辦法
- 供水公司主業(yè)管理辦法
- 法蘭西國族認同研究:從“國族傳奇”看歷史演變
- 民國茶葉消費量與產(chǎn)量動態(tài)關(guān)系研究
- 內(nèi)部濕度差異對硬化水泥漿體特性的影響研究
- 公共物品維護管理辦法
- 變頻器效率優(yōu)化-洞察及研究
- 跨界共生:“雙師型”教師企業(yè)實踐激勵機制創(chuàng)新探討
- 鞭毛狀微生物阪崎腸桿菌的乳粉檢測技術(shù)研究
- 辦公室應(yīng)聘題庫及答案
- 2025年河北中考地理真題含答案
- 鐵礦尾礦清運方案(3篇)
- 國開機考答案 管理學(xué)基礎(chǔ)2025-06-27
- 國家開放大學(xué)《思想道德與法治》社會實踐報告范文一
- 【9語安徽中考卷】2025年安徽省中考招生考試真題語文試卷(真題+答案)
- 2025年空氣過濾器行業(yè)分析報告
- 同等學(xué)力人員申請碩士學(xué)位電子科學(xué)與技術(shù)學(xué)科綜合水平全國統(tǒng)一考試大綱(第二版)
- (高清版)DG∕TJ 08-507-2018 高強混凝土抗壓強度無損檢測技術(shù)標準
- 2024年鐵嶺市三支一扶考試真題
- 2024版機電工程施工質(zhì)量標準化數(shù)字模型圖集
評論
0/150
提交評論