基于C++實(shí)現(xiàn)TCP聊天室功能
本文實(shí)例為大家分享了C++實(shí)現(xiàn)TCP聊天室功能的具體代碼,供大家參考,具體內(nèi)容如下
TCPServer.cpp:
// TCPServer.cpp : Defines the entry point for the console application. #include "stdafx.h" #include<iostream> #include<stdio.h> #include<WinSock2.h> using namespace std; #pragma comment(lib,"ws2_32.lib") const char *WELCOMTOCHATROOM = "歡迎來到聊天室"; const char *MESSAGECOMED = "收到客戶端發(fā)來的信息:"; const char *ANSWER = "您的回復(fù)是:"; const char *WAIFORCLIENT = "等待客戶連接......."; int main() { BOOL bSuccess = FALSE;//是否執(zhí)行成功 int nError = ERROR; SOCKET socketServ = INVALID_SOCKET; SOCKET socketClient = INVALID_SOCKET; do { WSADATA wsaData; nError = WSAStartup(MAKEWORD(2, 2), &wsaData);//初始化 if (0 != nError) break; //創(chuàng)建Socket socketServ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == socketServ) break; //創(chuàng)建地址 sockaddr_in addrServ = { 0 }; addrServ.sin_addr.S_un.S_addr = INADDR_ANY;//所有ip地址 addrServ.sin_family = AF_INET;//ipv4 addrServ.sin_port = htons(10800);//端口 //綁定 if (SOCKET_ERROR == bind(socketServ, (SOCKADDR*)&addrServ, sizeof(addrServ))) break; if (SOCKET_ERROR == listen(socketServ, SOMAXCONN)) break; sockaddr_in addrClient = { 0 }; int nAddrSize = sizeof(addrClient); //等待客戶連接 cout << WAIFORCLIENT << endl; socketClient = accept(socketServ, (SOCKADDR*)&addrClient, &nAddrSize); if (INVALID_SOCKET == socketClient) break; if (SOCKET_ERROR == send(socketClient, WELCOMTOCHATROOM, strlen(WELCOMTOCHATROOM)+1,0)) break; char szRecvMessage[MAXBYTE] = { 0 }; char szSendMessage[MAXBYTE] = { 0 }; while (true) { int nResult = recv(socketClient, szRecvMessage, MAXBYTE, 0); if (nResult > 0) { cout << MESSAGECOMED << szRecvMessage << endl; cout << ANSWER; cin >> szSendMessage; if (SOCKET_ERROR == send(socketClient, szSendMessage, strlen(szSendMessage)+1, 0)) break;//跳出while } else if (nResult == 0) { cout << "連接被關(guān)閉:" << endl; break; } else { cout << "recv錯誤!" << endl; break; } } bSuccess = TRUE; } while (false); if (!bSuccess) { nError = WSAGetLastError(); cout << "出現(xiàn)錯誤信息" << nError << endl; if (INVALID_SOCKET != socketServ) closesocket(socketServ); if (INVALID_SOCKET != socketClient) closesocket(socketClient); } WSACleanup(); system("pause"); return 0; }
TCPClient.cpp:
// TCPClient.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<iostream> //#include<stdio.h> #include<WinSock2.h> using namespace std; #pragma comment(lib,"ws2_32.lib") const char *SERVERIPADDRESS = "192.168.8.106"; int main() { bool bSuccess = FALSE; SOCKET socketClient = INVALID_SOCKET;//客戶端的套接字 do { WSADATA wsaData; if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))//叫醒 break; //判斷 if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion)) break; //拿手機(jī) socketClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == socketClient) break; //拿到電話號碼 sockaddr_in addrServ = { 0 }; addrServ.sin_family = AF_INET; addrServ.sin_port = htons(10800); addrServ.sin_addr.S_un.S_addr = inet_addr(SERVERIPADDRESS); //撥打號碼 if (SOCKET_ERROR == connect(socketClient, (SOCKADDR*)&addrServ, sizeof(addrServ))) break; char szRecvMessage[MAXBYTE] = { 0 }; char szSendMessage[MAXBYTE] = { 0 }; while (true) { int nResult = recv(socketClient, szRecvMessage, MAXBYTE, 0); if (nResult > 0)//接收到信息 { cout << "接收到來自服務(wù)器的消息:" << szRecvMessage << endl; cout << "你的回復(fù)是:"; cin >> szSendMessage; if (SOCKET_ERROR == send(socketClient, szSendMessage, MAXBYTE, 0)) break;//跳出循環(huán) } else if (nResult == 0)//連接被關(guān)閉 { cout << "連接被關(guān)閉:" << endl; break; } else { cout << "未知原因:" << endl; break; } } bSuccess = TRUE; } while (FALSE); if (!bSuccess) { int nError=WSAGetLastError(); cout << "出現(xiàn)錯誤信息" << nError << endl; if (INVALID_SOCKET != socketClient) closesocket(socketClient); } WSACleanup(); system("pause"); return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)求動態(tài)矩陣各元素的和
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)求動態(tài)矩陣各元素的和,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10C++實(shí)現(xiàn)LeetCode(2.兩個數(shù)字相加)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(兩個數(shù)字相加),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Qt實(shí)現(xiàn)拖拽功能圖文教程(支持拖放文件、拖放操作)
這篇文章主要給大家介紹了關(guān)于Qt實(shí)現(xiàn)拖拽功能(支持拖放文件、拖放操作)的相關(guān)資料,Qt是一款多平臺的C++應(yīng)用程序開發(fā)框架,它的獨(dú)特之處在于可以快速開發(fā)出拖放式的開發(fā)桌面程序,需要的朋友可以參考下2023-11-11C/C++ 中堆和棧及靜態(tài)數(shù)據(jù)區(qū)詳解
這篇文章主要介紹了C/C++ 中堆和棧及靜態(tài)數(shù)據(jù)區(qū)詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04QT使用QComBox和QLineEdit實(shí)現(xiàn)模糊查詢功能
模糊查詢是指根據(jù)用戶輸入的文本,在下拉框的選項(xiàng)中進(jìn)行模糊匹配,并動態(tài)地顯示匹配的選項(xiàng),本文將使用QComBox和QLineEdit實(shí)現(xiàn)模糊查詢功能,需要的可以參考下2023-11-11C語言詳細(xì)分析結(jié)構(gòu)體的內(nèi)存對齊規(guī)則
C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲不同類型的數(shù)據(jù)項(xiàng),本篇讓我們來了解C 的結(jié)構(gòu)體內(nèi)存對齊2022-07-07