C++多线程服务器
C++ multi threaded server
我正在处理一个服务器,它只连接一个客户端并发回他们键入的内容。到目前为止,它运行良好,但我想让它成为多线程的,这样我就可以连接更多的客户端,这样他们就可以"说话"。你们能给我推荐任何源代码,我可以查看这些源代码来对我自己的代码进行一些调整吗?谢谢。我也希望这在不同的网络上工作,我不确定如何做到这一点,所以一些源代码也可以工作。另外,我在八年级,没有太多经验,所以一个解释清楚的答案将不胜感激。
int main() {
WSADATA wsaData;
// Initialize Winsock
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if(iResult != 0)
{
printf("WSAStartup failed: %dn", iResult);
return 1;
}
struct addrinfo *result = NULL,
hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET; // Internet address family is unspecified so that either an IPv6 or IPv4 address can be returned
hints.ai_socktype = SOCK_STREAM; // Requests the socket type to be a stream socket for the TCP protocol
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
// Resolve the local address and port to be used by the server
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
if (iResult != 0)
{
printf("getaddrinfo failed: %dn", iResult);
WSACleanup();
return 1;
}
SOCKET ListenSocket = INVALID_SOCKET;
// Create a SOCKET for the server to listen for client connections
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (ListenSocket == INVALID_SOCKET)
{
printf("Error at socket(): %dn", WSAGetLastError());
freeaddrinfo(result);
WSACleanup();
return 1;
}
// Setup the TCP listening socket
iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
if (iResult == SOCKET_ERROR)
{
printf("bind failed: %d", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
WSACleanup();
return 1;
}
freeaddrinfo(result);
// To listen on a socket
if ( listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
{
printf("listen failed: %dn", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
SOCKET ClientSocket;
ClientSocket = INVALID_SOCKET;
// Accept a client socket
ClientSocket = accept(ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET)
{
printf("accept failed: %dn", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
char recvbuf[DEFAULT_BUFFER_LENGTH];
int iSendResult;
// reveice until the client shutdown the connection
do {
iResult = recv(ClientSocket, recvbuf, DEFAULT_BUFFER_LENGTH, 0);
if (iResult > 0)
{
char msg[DEFAULT_BUFFER_LENGTH];
memset(&msg, 0, sizeof(msg));
strncpy(msg, recvbuf, iResult);
printf("Received: %sn", msg);
iSendResult = send(ClientSocket, recvbuf, iResult, 0);
if (iSendResult == SOCKET_ERROR)
{
printf("send failed: %dn", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
printf("Bytes sent: %ldn", iSendResult);
}
else if (iResult == 0)
printf("Connection closedn");
else
{
printf("recv failed: %dn", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
//return 1;
}
} while (iResult > 0);
// Free the resouces
closesocket(ListenSocket);
WSACleanup();
getchar();
return 0;
}
有几十种方法可以实现此解决方案。
首先,最好设计哪种方法更适合您的教育目的。
考虑网络编程:
我可以推荐的网络编程的最佳指南之一是Beej的指南。
考虑服务器端体系结构:
我想推荐 C++ Anthony Williams 的 Concurrency in Action: Practical Multithreading 以供进一步阅读。
在你面前,一整片可能性的海洋 - 去吧!
Ps:考虑这样的一般问题
最好在软件工程论坛中寻找此类问题的答案。
相关文章:
- C/C++ Linux 上的多线程服务器/客户端崩溃
- 设计低线程争用的多线程聊天服务器
- 使用线程池提升 ASIO 多线程 TCP 服务器
- C++多线程服务器
- 简单的非阻塞多线程 tcp 服务器
- 多线程套接字编程服务器仅从 1 个客户端线程获取消息
- 来自 boost 的 udp 服务器不适用于多线程,但仅在主线程上工作
- 在C 中将多个客户端连接到Windows中的单个服务器中的多线程
- 多线程客户端/服务器原型中的分割故障
- 在多线程HTTP服务器中发送后,如何干净地关闭套接字
- 卫生多线程服务器
- C 多线程TCP服务器问题
- gSOAP C++ 多线程独立服务器和客户端示例
- C++中的多线程 Web 服务器
- 在多线程c++服务器应用程序中处理非常量全局配置
- 多线程服务器在一个线程中处理多个客户端
- 带有libevent的多线程HTTP服务器
- c++tcp多线程客户端/服务器-如何与线程套接字处理程序进行通信
- 如何使我的服务器多线程
- 服务器多线程无法保存最后一个套接字描述符