winsocket2 tcp服务端发送信息到多个tcp客户端
时间: 2023-10-07 19:07:00 浏览: 55
要在Winsock2 TCP服务器中向多个TCP客户端发送信息,可以使用一个循环来迭代每个客户端套接字,并使用send函数向每个客户端发送消息。以下是一个简单的示例代码:
```c
#include <stdio.h>
#include <winsock2.h>
#define MAX_CLIENTS 10
int main() {
WSADATA wsaData;
SOCKET serverSocket, clientSockets[MAX_CLIENTS];
struct sockaddr_in serverAddr, clientAddr;
char ip[INET_ADDRSTRLEN];
const char* message = "Hello, clients!";
// 初始化Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize winsock.\n");
return 1;
}
// 创建套接字
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == INVALID_SOCKET) {
printf("Failed to create socket.\n");
WSACleanup();
return 1;
}
// 设置服务器地址和端口
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8080); // 例如,这里假设服务器监听端口为8080
serverAddr.sin_addr.s_addr = INADDR_ANY;
// 绑定套接字到服务器地址和端口
if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
printf("Failed to bind socket.\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
// 监听连接
if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {
printf("Failed to listen on socket.\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
printf("Waiting for incoming connections...\n");
// 初始化客户端套接字数组
for (int i = 0; i < MAX_CLIENTS; ++i) {
clientSockets[i] = INVALID_SOCKET;
}
while (1) {
// 接受客户端连接
int clientAddrLen = sizeof(clientAddr);
SOCKET clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen);
if (clientSocket == INVALID_SOCKET) {
printf("Failed to accept client connection.\n");
closesocket(serverSocket);
WSACleanup();
return 1;
}
// 获取客户端IP地址
const char* clientIP = inet_ntop(AF_INET, &(clientAddr.sin_addr), ip, INET_ADDRSTRLEN);
if (clientIP == NULL) {
printf("Failed to convert IP address to string.\n");
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 1;
}
printf("Client connected from: %s\n", clientIP);
// 将新的客户端套接字添加到数组中
for (int i = 0; i < MAX_CLIENTS; ++i) {
if (clientSockets[i] == INVALID_SOCKET) {
clientSockets[i] = clientSocket;
break;
}
}
// 向每个客户端发送消息
for (int i = 0; i < MAX_CLIENTS; ++i) {
if (clientSockets[i] != INVALID_SOCKET) {
if (send(clientSockets[i], message, strlen(message), 0) == SOCKET_ERROR) {
printf("Failed to send message to client.\n");
closesocket(clientSockets[i]);
clientSockets[i] = INVALID_SOCKET;
}
}
}
}
// 关闭套接字和清理Winsock
for (int i = 0; i < MAX_CLIENTS; ++i) {
if (clientSockets[i] != INVALID_SOCKET) {
closesocket(clientSockets[i]);
}
}
closesocket(serverSocket);
WSACleanup();
return 0;
}
```
在代码中,服务器创建了一个监听套接字,并等待客户端的连接。一旦有客户端连接成功,accept函数将返回一个新的套接字用于与客户端进行通信。然后,将新的客户端套接字添加到一个数组中,以便在发送消息时能够迭代所有客户端。使用循环遍历数组中的每个客户端套接字,并使用send函数向每个客户端发送指定的消息。请注意,此示例仅适用于TCP套接字连接,并且最多支持10个客户端连接。你可以根据需要调整MAX_CLIENTS的值。