用c++和ws2-32库写一个聊天室服务端
时间: 2023-06-17 10:08:49 浏览: 58
好的,以下是一个简单的聊天室服务端的C++代码:
```c++
#include <iostream>
#include <winsock2.h> //ws2_32库头文件
#pragma comment(lib,"ws2_32.lib") //ws2_32库链接
using namespace std;
int main()
{
//初始化Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
cout << "WSAStartup failed: " << iResult << endl;
return 1;
}
//创建监听socket
SOCKET listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listenSocket == INVALID_SOCKET) {
cout << "socket failed: " << WSAGetLastError() << endl;
WSACleanup();
return 1;
}
//绑定端口
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = INADDR_ANY;
service.sin_port = htons(1234);
iResult = bind(listenSocket, (SOCKADDR*)&service, sizeof(service));
if (iResult == SOCKET_ERROR) {
cout << "bind failed: " << WSAGetLastError() << endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
//开始监听
iResult = listen(listenSocket, SOMAXCONN);
if (iResult == SOCKET_ERROR) {
cout << "listen failed: " << WSAGetLastError() << endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
//接受客户端连接
sockaddr_in clientAddr;
int addrLen = sizeof(clientAddr);
SOCKET clientSocket = accept(listenSocket, (SOCKADDR*)&clientAddr, &addrLen);
if (clientSocket == INVALID_SOCKET) {
cout << "accept failed: " << WSAGetLastError() << endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
cout << "Client connected: " << inet_ntoa(clientAddr.sin_addr) << endl;
//接收客户端消息
char recvbuf[1024];
int recvbuflen = 1024;
iResult = recv(clientSocket, recvbuf, recvbuflen, 0);
if (iResult > 0) {
cout << "Received: " << recvbuf << endl;
}
else if (iResult == 0) {
cout << "Connection closing..." << endl;
}
else {
cout << "recv failed: " << WSAGetLastError() << endl;
closesocket(clientSocket);
closesocket(listenSocket);
WSACleanup();
return 1;
}
//发送消息给客户端
const char* sendbuf = "Welcome to the chat room!";
int sendbuflen = strlen(sendbuf);
iResult = send(clientSocket, sendbuf, sendbuflen, 0);
if (iResult == SOCKET_ERROR) {
cout << "send failed: " << WSAGetLastError() << endl;
closesocket(clientSocket);
closesocket(listenSocket);
WSACleanup();
return 1;
}
//关闭socket和Winsock
closesocket(clientSocket);
closesocket(listenSocket);
WSACleanup();
return 0;
}
```
注意事项:
1. 该代码只支持单个客户端连接,若要支持多个客户端,则需要用多线程等技术进行改进。
2. 要在Windows系统上编译运行该代码,需要使用Visual Studio等IDE,并在项目属性中添加ws2_32.lib库链接。