winSock编程实现聊天程序

时间: 2023-05-31 21:03:33 浏览: 54
由于WinSock编程需要用到网络通信和多线程技术,比较复杂,以下是一个简单的WinSock编程实现聊天程序的示例代码: 服务器端: ```c++ #include <WinSock2.h> #include <iostream> #include <string> #include <thread> #include <vector> using namespace std; SOCKET serverSocket; vector<SOCKET> clients; void handleClient(SOCKET clientSocket) { char buf[1024]; int len; while (true) { len = recv(clientSocket, buf, sizeof(buf), 0); if (len == 0) { break; } buf[len] = '\0'; cout << "Received: " << buf << endl; for (int i = 0; i < clients.size(); i++) { if (clients[i] != clientSocket) { send(clients[i], buf, len, 0); } } } closesocket(clientSocket); } int main() { WSADATA wsadata; WSAStartup(MAKEWORD(2, 2), &wsadata); serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); SOCKADDR_IN addr; addr.sin_family = AF_INET; addr.sin_port = htons(8888); addr.sin_addr.s_addr = htonl(INADDR_ANY); bind(serverSocket, (SOCKADDR*)&addr, sizeof(addr)); listen(serverSocket, SOMAXCONN); cout << "Server started." << endl; while (true) { SOCKET clientSocket = accept(serverSocket, NULL, NULL); cout << "Client connected." << endl; clients.push_back(clientSocket); thread t(handleClient, clientSocket); t.detach(); } closesocket(serverSocket); WSACleanup(); return 0; } ``` 客户端: ```c++ #include <WinSock2.h> #include <iostream> #include <string> using namespace std; SOCKET clientSocket; void receiveData() { char buf[1024]; int len; while (true) { len = recv(clientSocket, buf, sizeof(buf), 0); if (len == 0) { break; } buf[len] = '\0'; cout << "Received: " << buf << endl; } closesocket(clientSocket); } int main() { WSADATA wsadata; WSAStartup(MAKEWORD(2, 2), &wsadata); clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); SOCKADDR_IN addr; addr.sin_family = AF_INET; addr.sin_port = htons(8888); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); connect(clientSocket, (SOCKADDR*)&addr, sizeof(addr)); cout << "Connected to server." << endl; thread t(receiveData); t.detach(); string msg; while (true) { getline(cin, msg); if (msg == "exit") { break; } send(clientSocket, msg.c_str(), msg.length(), 0); } closesocket(clientSocket); WSACleanup(); return 0; } ``` 这个聊天程序实现了简单的群聊功能,能够让多个客户端连接到服务器并互相发送消息。当客户端输入“exit”时,程序结束。

相关推荐

#define _WINSOCK_DEPRECATED_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <WinSock2.h> #ifndef MSG_NOSIGNAL #define MSG_NOSIGNAL 0 #endif #pragma comment(lib, "ws2_32.lib") #define MAX_CLIENTS 10 #define MAX_BUFFER_SIZE 50 SOCKET clientSockets[MAX_CLIENTS]; // 客户端套接字数组 int numClients = 0; // 客户端数量 DWORD WINAPI ClientThread(LPVOID lpParam) { SOCKET clientSocket = *(SOCKET*)lpParam; char recvBuf[MAX_BUFFER_SIZE]; while (1) { int ret = recv(clientSocket, recvBuf, MAX_BUFFER_SIZE, 0); if (ret <= 0) { break; } // 将消息广播给所有客户端 for (int i = 0; i < numClients; i++) { send(clientSockets[i], recvBuf, strlen(recvBuf) + 1, MSG_NOSIGNAL); } } // 客户端断开连接,从套接字数组中移除 for (int i = 0; i < numClients; i++) { if (clientSockets[i] == clientSocket) { for (int j = i; j < numClients - 1; j++) { clientSockets[j] = clientSockets[j + 1]; } break; } } numClients--; closesocket(clientSocket); return 0; } int main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1, 1); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { return -1; } if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) { WSACleanup(); return -1; } SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(6000); bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); listen(sockSrv, 5); printf("服务器已启动,等待客户端连接...\n"); while (1) { SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR); SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len); printf("客户端 %s:%d 已连接\n", inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port)); // 将新的客户端套接字添加到数组中 clientSockets[numClients++] = sockConn; // 创建线程处理客户端消息 HANDLE hThread = CreateThread(NULL, 0, ClientThread, &sockConn, 0, NULL); CloseHandle(hThread); } closesocket(sockSrv); WSACleanup(); return 0; }

最新推荐

recommend-type

网络编程课程设计-简单的聊天室程序设计

以Visual C++作为开发平台, 采用客户/服务器模式,分为客户端程序和服务器端程序。服务器采用WINSOCK I/O模型中的任一种,支持多个客户同时在线聊天。
recommend-type

VB 网络聊天系统的设计与实现

本文主要描述了如何利用汇编语言编写一个能够实现网络之间信息传递的聊天程序系统.并介绍了无连接协议的SOCKET编程模型,以及阐述了聊天程序的设计目的前景和具体规划,还有聊天程序的商业运作.本论文共分为五部分. 第...
recommend-type

VB 、SQL 局域网内部的聊天软件 报告

具体内容是局域网内部的聊天软件,基于VB编程的基础上,利用Winsock控件,选择TCP协议提供可靠的、面向连接的传输控制,选择协议的配置,确定你的计算机名 ,然后进行连接。本组完成的局域网聊天工具,主要的功能有...
recommend-type

C++聊天室系统源代码-课程设计

基于客户/服务器模型的套接字编程 分析winsock编程技术,特别是Winsock使用; 2) 分析聊天程序的功能及其相关网络协议; 3) 给出V程序流程图和设计方案; 4) 选择开发环境,编译源程序; 5) 给出软件测试文档;
recommend-type

android手机应用源码Imsdroid语音视频通话源码.rar

android手机应用源码Imsdroid语音视频通话源码.rar
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

可见光定位LED及其供电硬件具体型号,广角镜头和探测器,实验设计具体流程步骤,

1. 可见光定位LED型号:一般可使用5mm或3mm的普通白色LED,也可以选择专门用于定位的LED,例如OSRAM公司的SFH 4715AS或Vishay公司的VLMU3500-385-120。 2. 供电硬件型号:可以使用常见的直流电源供电,也可以选择专门的LED驱动器,例如Meanwell公司的ELG-75-C或ELG-150-C系列。 3. 广角镜头和探测器型号:一般可采用广角透镜和CMOS摄像头或光电二极管探测器,例如Omron公司的B5W-LA或Murata公司的IRS-B210ST01。 4. 实验设计流程步骤: 1)确定实验目的和研究对象,例如车辆或机器人的定位和导航。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。