php tcp连接接多个客服端,c – TCP Winsock:接受多个连接/客户端

我试图将客户端倍增,并将其发送给每个客户端.

但它只适用于一个,在一个客户端连接服务器后,只是无法用于传入连接.

while(true)

{

if(Sub = accept(Socket, (sockaddr*)&IncomingAddress, &AddressLen))

{

for(int i = 0; i < MaxUsers; i++)

{

if(!ClientAddress[i].sin_family)

{

ClientAddress[i] = IncomingAddress;

char Version[128], Dir[256], Path[256], URL[128], Message[256];

GetCurrentDirectory(256, Dir);

sprintf(Path, "%s\Version.ini", Dir);

GetPrivateProfileString("Default", "Version", "1.0.0.0", Version, 128, Path);

GetPrivateProfileString("Default", "URL", "", URL, 128, Path);

GetPrivateProfileString("Default", "Message", "", Message, 256, Path);

send(Sub, Version, 128, 0);

send(Sub, Message, 256, 0);

break;

}

}

continue;

}

}

最佳答案

当然,新客户端不能被接受,因为服务器只处理接受的客户端,即服务器正忙.

解决方案很简单:为每个接受的客户端创建一个新线程,并在那里处理客户端会话.只需使用_beginthreadex()(#include< process.h>):

unsigned __stdcall ClientSession(void *data)

{

SOCKET client_socket = (SOCKET)data;

// Process the client.

}

int _tmain(int argc, _TCHAR* argv[])

{

...

SOCKET client_socket;

while ((client_socket = accept(server_socket, NULL, NULL))) {

// Create a new thread for the accepted client (also pass the accepted client socket).

unsigned threadID;

HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &ClientSession, (void*)client_socket, 0, &threadID);

}

}

顺便说一句,send()/ recv()函数不保证在一次调用时发送/接收所有数据.有关这些功能的返回值,请参阅文档.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Winsock创建TCP客户端的基本步骤: 1. 初始化Winsock库 ```c WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { printf("WSAStartup failed: %d\n", iResult); return 1; } ``` 2. 创建套字 ```c SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (clientSocket == INVALID_SOCKET) { printf("socket failed: %ld\n", WSAGetLastError()); WSACleanup(); return 1; } ``` 3. 设置服务器地址和口号 ```c sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(8080); inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr); ``` 4. 连接服务器 ```c int iResult = connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)); if (iResult == SOCKET_ERROR) { printf("connect failed: %d\n", WSAGetLastError()); closesocket(clientSocket); WSACleanup(); return 1; } ``` 5. 发送和收数据 ```c char sendBuf[1024] = "Hello, server!"; char recvBuf[1024]; int recvLen; iResult = send(clientSocket, sendBuf, strlen(sendBuf), 0); if (iResult == SOCKET_ERROR) { printf("send failed: %d\n", WSAGetLastError()); closesocket(clientSocket); WSACleanup(); return 1; } recvLen = recv(clientSocket, recvBuf, 1024, 0); if (recvLen > 0) { recvBuf[recvLen] = '\0'; printf("Received: %s\n", recvBuf); } else if (recvLen == 0) { printf("Connection closed\n"); } else { printf("recv failed: %d\n", WSAGetLastError()); } ``` 6. 关闭套字和Winsock库 ```c closesocket(clientSocket); WSACleanup(); ``` 完整的代码示例: ```c #include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib") int main() { WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { printf("WSAStartup failed: %d\n", iResult); return 1; } SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (clientSocket == INVALID_SOCKET) { printf("socket failed: %ld\n", WSAGetLastError()); WSACleanup(); return 1; } sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(8080); inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr); iResult = connect(clientSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr)); if (iResult == SOCKET_ERROR) { printf("connect failed: %d\n", WSAGetLastError()); closesocket(clientSocket); WSACleanup(); return 1; } char sendBuf[1024] = "Hello, server!"; char recvBuf[1024]; int recvLen; iResult = send(clientSocket, sendBuf, strlen(sendBuf), 0); if (iResult == SOCKET_ERROR) { printf("send failed: %d\n", WSAGetLastError()); closesocket(clientSocket); WSACleanup(); return 1; } recvLen = recv(clientSocket, recvBuf, 1024, 0); if (recvLen > 0) { recvBuf[recvLen] = '\0'; printf("Received: %s\n", recvBuf); } else if (recvLen == 0) { printf("Connection closed\n"); } else { printf("recv failed: %d\n", WSAGetLastError()); } closesocket(clientSocket); WSACleanup(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值