【问题标题】:Server not returning the last response message to client服务器没有向客户端返回最后一个响应消息
【发布时间】: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,&amp;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,&amp;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 sockets


【解决方案1】:

那是因为你在接受客户端连接后已经发送Hello, From server,所以事件的顺序是这样的:

  1. 客户端:连接并等待用户输入
  2. 服务器:接受连接,发送服务器消息S(来自服务器的问候)
  3. 用户:输入命令C(随便)
  4. 客户端:发送C,从第2步读取S,等待用户输入
  5. 服务器:读取C,发送S
  6. 用户:输入命令Exit
  7. 客户端:发送Exit,从第5步读取S,退出
  8. 服务器:读取Exit,发送E(从服务器退出)但此时客户端可能不再连接。

如果您在接受连接之后但在 while 循环之前删除该消息的发送,那么它应该可以按预期工作。

【讨论】:

    猜你喜欢
    • 2021-07-19
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    相关资源
    最近更新 更多