我运行一个套接字编程代码,用于多个客户端与一台服务器的通信。一切都正常进行,但是当我 ctrl C 退出其中一个客户端时,服务器没有按我预期的那样显示。下面是代码:
客户端.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 4444
int main(){
int clientSocket, ret;
struct sockaddr_in serverAddr;
char buffer[1024];
clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if(clientSocket < 0){
printf("[-]Error in connection.\n");
exit(1);
}
printf("[+]Client Socket is created.\n");
memset(&serverAddr, '\0', sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
ret = connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
if(ret < 0){
printf("[-]Error in connection.\n");
exit(1);
}
printf("[+]Connected to Server.\n");
while(1){
printf("Client: \t");
scanf("%s", &buffer[0]);
send(clientSocket, buffer, strlen(buffer), 0);
if(strcmp(buffer, ":exit") == 0){
close(clientSocket);
printf("[-]Disconnected from server.\n");
exit(1);
}
if(recv(clientSocket, buffer, 1024, 0) < 0){
printf("[-]Error in receiving data.\n");
}else{
printf("Server: \t%s\n", buffer);
}
}
return 0;
}
服务器.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 4444
int main(){
int sockfd, ret;
struct sockaddr_in serverAddr;
int newSocket;
struct sockaddr_in newAddr;
socklen_t addr_size;
char buffer[1024];
pid_t childpid;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0){
printf("[-]Error in connection.\n");
exit(1);
}
printf("[+]Server Socket is created.\n");
memset(&serverAddr, '\0', sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
ret = bind(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
if(ret < 0){
printf("[-]Error in binding.\n");
exit(1);
}
printf("[+]Bind to port %d\n", 4444);
if(listen(sockfd, 10) == 0){
printf("[+]Listening....\n");
}else{
printf("[-]Error in binding.\n");
}
while(1){
newSocket = accept(sockfd, (struct sockaddr*)&newAddr, &addr_size);
if(newSocket < 0){
exit(1);
}
printf("Connection accepted from %s:%d\n", inet_ntoa(newAddr.sin_addr), ntohs(newAddr.sin_port));
if((childpid = fork()) == 0){
close(sockfd);
while(1){
recv(newSocket, buffer, 1024, 0);
if(strcmp(buffer, ":exit") == 0){
printf("Disconnected from %s:%d\n", inet_ntoa(newAddr.sin_addr), ntohs(newAddr.sin_port));
break;
}else{
printf("Client: %s\n", buffer);
send(newSocket, buffer, strlen(buffer), 0);
bzero(buffer, sizeof(buffer));
}
}
}
}
close(newSocket);
return 0;
}
当我按 ctrl C 退出客户端时。在服务器端,它显示:
Client:
Client:
Client:
Client:
它似乎永远循环“Client:”而不是显示 printf“Disconnected from...”的消息,并继续按照我的预期与其他客户端一起工作。我从 youtube 上看这段代码,他们可以在视频中正确运行它,但我不知道为什么当我下载这段代码并在我的电脑上运行时,它会出现这个问题。谁能帮我解决这个问题,以便服务器可以打印消息“断开连接...”。谢谢。
最佳答案
When I press ctrl C to exit the client. On the server side, it shows:
Client: Client: Client: Client:
and it's seem to loop "Client:" forever instead of showing message of printf"Disconnected from..." and continue to work with other clients as I expected.
您的代码仅在收到来自客户端的“:exit”消息时才会打印断开连接消息并退出循环。如果您使用 Ctrl-C 终止客户端,则它会终止而不发送任何此类消息。
健壮的服务器代码会检查 recv()
调用的返回值,它会返回 -1 以表示错误。您的服务器会忽略它,只是尝试一次又一次地读取。尽管您不能指望在客户端消失的每种情况下都会出现错误,但您的服务器不断打印“Client:”这一事实表明您在这种情况下会出现错误。
I look at this code from on youtube, they can run it properly in the video but I do not know why when I download this code and run on my computer, it gets that problem.
要么他们在视频中演示的内容与您提供的代码不同(也许视频对此具有欺骗性),要么他们通过键入“:exit”命令退出了客户端,而不仅仅是杀死客户端。
关于c - Socket Programming in C : When client exit server, 服务器崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53094542/