c - 在 C 编程中使用 TCP/IP 套接字计算连接到服务器的客户端数
问题描述
我必须计算在 C 编程中使用互斥锁和 TCP/IP 套接字连接到我的服务器的客户端数量。
这是我的server.c
源文件:
int numberOfClientsConnected = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int main ()
{
// ... creation, binding and listen ...
while (1) {
clientSocket = accept(serverSocket, (struct sockaddr*)&newAddress, &addrSize);
pthread_mutex_lock(&mutex);
numberOfClientsConnected++;
pthread_mutex_unlock(&mutex);
child = fork();
if (child == 0) {
close(serverSocket);
while (1) {
recv(clientSocket, buffer, 1024, 0);
if (strcmp(buffer, ":exit") == 0) {
printf("%s:%d left\n", inet_ntoa(newAddress.sin_addr), ntohs(newAddress.sin_port));
pthread_mutex_lock(&mutex);
numberOfClientsConnected--;
pthread_mutex_unlock(&mutex);
break;
}
else {
printf("%s:%d wrote: %s\n", inet_ntoa(newAddress.sin_addr), ntohs(newAddress.sin_port), buffer);
printf("There are %d client(s) connected\n", numeroDiClientAttualmenteConnessi);
// Invio del messaggio
send(clientSocket, buffer, strlen(buffer), 0);
}
}
}
}
close(clientSocket);
return 0;
}
正如你在我的截图中看到的:
如果我检查从 client1 连接的客户端数量,它将始终显示“1”;如果我与 client2 核对,它总是会显示“2”。也就是说,连接的客户端数量取决于我发短信的客户端。有什么错误?
解决方案
fork()
创建一个新进程,而不是一个新线程。变量在进程之间不共享。您的子进程获得了变量的副本,并且只能看到变量被分叉时的值。
推荐阅读
- javascript - 需要解释 ng-template 中的 let-* 指令
- javascript - 用js做一个“display:none”到“display:block”,让所有的div碰撞
- java - 如何将图像适配器(它是无限循环器视图)放置在片段中?
- generics - Rust 编译器如何在泛型函数参数的借用和移动之间做出决定?
- node.js - 如何将文本字段添加到文件突变
- css - 铬 75.x。最新更新集:内部输入建议。这会导致字体变小
- list - Cognos HTML 输出为每列生成多行
- python - 只写一次特定行?
- terraform - 是否期望数据 terraform_remote_sate 在不存在时创建状态?
- observable - 如何设置多个相同类型的环境对象