【发布时间】:2019-09-03 13:44:01
【问题描述】:
我制作了一个客户端/服务器程序,其中客户端服务器的每个命令都返回“Hello,From server”,退出时它应该返回“Exiting the server”,但它返回“Hello,From server”并退出
我尝试在语句之前和 break 语句之前放置一个字符串,并在 while 循环之后放置一个字符串,两者都被打印,而从服务器结束时没有打印到客户端
client.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(void)
{
int client_socket = socket(AF_INET, SOCK_STREAM, 0); //creating client socket
struct sockaddr_in server_address; //creating structure for server address
server_address.sin_family = AF_INET;
server_address.sin_port = htons(9002);
server_address.sin_addr.s_addr = INADDR_ANY;
if(connect(client_socket,(struct sockaddr *)&server_address,sizeof(server_address))<0) //establishing connection between client and server
{
printf("Something went wrong while connecting to server!\n");
close(client_socket);
return -3;
}
char server_response[256]; //creating buffer for receiving data from server
char client_request[256]; // creating buffer for sending request from the client
while(1)
{
printf("Enter command: ");
scanf("%s",client_request);
send(client_socket,&client_request,sizeof(char)*strlen(client_request),0); // sending command from the client
memset(server_response,0,sizeof(server_response)); // cleaning the buffer
recv(client_socket,&server_response,sizeof(server_response),0); //data receiving from the server
printf("%s\n",server_response); //printing data to console
if(strcmp(client_request,"exit")==0)break; // termnating condition for the client
}
close(client_socket); //closing the socket
return 0;
}
服务器.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
void print_client(struct sockaddr_in client_address)
{
unsigned long address = ntohl(client_address.sin_addr.s_addr);
unsigned int a = (address & (0xff));
unsigned int b = (address & (0xff << 8)) >> 8;
unsigned int c = (address & (0xff << 16)) >> 16;
unsigned int d = (address & (0xff << 24)) >> 24;
printf("Cient address: %u.%u.%u.%u ",d,c,b,a);
return;
}
int main(void)
{
char server_msg[256] = "Hello, From server"; // server response message
char end_msg[256] = "Exiting the server";// server ending message
char client_request[256];
int client_request_len;
int server_socket = socket(AF_INET, SOCK_STREAM, 0); // creating tcp/ip socket for server
struct sockaddr_in server_address; // creating server address
server_address.sin_family = AF_INET;
server_address.sin_port = htons(9002);
server_address.sin_addr.s_addr = INADDR_ANY;
if(bind(server_socket,(struct sockaddr *)&server_address, sizeof(server_address)) < 0) //binding socket to server address
{
printf("Could not bind address try later!\n");
}
listen(server_socket, 5); //making connection limited to 5 clients
struct sockaddr_in client_address;
unsigned int client_address_len;
int client_socket = accept(server_socket,(struct sockaddr *)&client_address,&client_address_len); //accepting the client request
print_client(client_address);
printf(" and port: %u connected\n",client_address.sin_port);
send(client_socket,server_msg,sizeof(server_msg),0);
while(1)
{
memset(client_request,0,sizeof(client_request)); // cleaning the buffer
recv(client_socket,&client_request,sizeof(client_request),0); // receiving request from client
printf("Message from client: %s\n",client_request);
if(strcmp(client_request,"exit")==0)
{
printf("breaking condition\n");
break; // terminating the connection
}
send(client_socket,server_msg,sizeof(server_msg),0); // sending server_msg to client
}
printf("send this message\n");
send(client_socket,end_msg,sizeof(end_msg),0);
close(server_socket); // closing the server socket
return 0;
}
实际结果
“客户”Enter command: shubham
Hello, From server
Enter command: kumar
Hello, From server
Enter command: end
Hello, From server
Enter command: exit
Hello, From server
预期结果“客户”
Hello, From server
Enter command: kumar
Hello, From server
Enter command: end
Hello, From server
Enter command: exit
Exiting the server
实际结果“服务器”
Cient address: 127.0.0.1 and port: 20710 connected
Message from client: shubham
Message from client: kumar
Message from client: end
Message from client: exit
breaking condition
send this message
【问题讨论】:
-
end_msg 和 server_msg 定义在哪里?
-
end_msg 和 server_msg 在上面定义为字符串。那些不是那么重要的代码唯一的问题在于给定的sn-p
-
看到来自服务器的“实际结果”看起来是您所期望的,问题可能出在正在读取消息的客户端代码中......感觉就像它没有检测到正在返回不同的消息。你能显示那个代码吗?
-
while(1) { printf("Enter command: "); scanf("%s",client_request); send(client_socket,&client_request,sizeof(char)*strlen(client_request),0); // sending command from the client memset(server_response,0,sizeof(server_response)); // cleaning the buffer recv(client_socket,&server_response,sizeof(server_response),0); //data receiving from the server printf("%s\n",server_response); //printing data to console if(strcmp(client_request,"exit")==0)break; // termnating condition for the client } close(client_socket); //closing the socket return 0; -
请编辑您的问题。评论区没有代码。