无法确认在C中完成从服务器端到客户端的数据发送

无法确认在C中完成从服务器端到客户端的数据发送,c,sockets,C,Sockets,我不熟悉C语言的套接字编程。我已经编写了一个服务器端程序和一个客户端程序。其功能描述如下: 服务器端:服务器向客户端发送1到9的整数,发送9后发送0。将0成功发送到客户端后,服务器应在运行服务器端的终端窗口上打印(而不是发送)“成功发送数据”,这是对服务器已将1发送到9,然后将0成功发送到客户端这一事实的确认 客户端:客户端应该显示服务器发送的所有整数。因为我们知道我们将接收从1到9再到0的整数,所以客户端的预期输出应该是: 1-->2-->3-->4-->5-->6-->7-->8-->9--

我不熟悉C语言的套接字编程。我已经编写了一个服务器端程序和一个客户端程序。其功能描述如下:

服务器端:服务器向客户端发送1到9的整数,发送9后发送0。将0成功发送到客户端后,服务器应在运行服务器端的终端窗口上打印(而不是发送)“成功发送数据”,这是对服务器已将1发送到9,然后将0成功发送到客户端这一事实的确认

客户端:客户端应该显示服务器发送的所有整数。因为我们知道我们将接收从1到9再到0的整数,所以客户端的预期输出应该是:

1-->2-->3-->4-->5-->6-->7-->8-->9-->0

我尝试使用以下代码实现这一点:

客户端代码:

#include <stdlib.h>

#include <sys/socket.h>
#include <sys/types.h>

#include <unistd.h>
#include <netinet/in.h>

int main()
{
    int client_socket;
    client_socket = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in server_address;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(8080);
    server_address.sin_addr.s_addr = INADDR_ANY;
    int connection_status = connect(client_socket, (struct sockaddr *) & server_address, sizeof(server_address));

    char data_recv;           //'data_recv' variable stores the data received from server
    recv(client_socket, &data_recv , sizeof(data_recv), 0);  //receive data from server
    while(data_recv - 48)            //receive 1 to 9. Once 0 is received, the loop breaks.
    {
        printf("%c --> ", data_recv);
        recv(client_socket, &data_recv , sizeof(data_recv), 0);
    }
    printf("%c\n", data_recv);        //print 0 
    close(client_socket);             //close client socket

    return 0;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
int客户机接口;
client\u socket=socket(AF\u INET,SOCK\u STREAM,0);
服务器地址中的结构sockaddr\u;
服务器地址.sin\u family=AF\u INET;
服务器地址sin端口=htons(8080);
server_address.sin_addr.s_addr=INADDR\u ANY;
int connection_status=connect(客户端套接字,(结构sockaddr*)和服务器地址,sizeof(服务器地址));
char data_recv;//'data_recv'变量存储从服务器接收的数据
recv(client_socket,&data_recv,sizeof(data_recv),0);//从服务器接收数据
while(data_recv-48)//接收1到9。一旦接收到0,循环中断。
{
printf(“%c-->”,数据记录);
recv(客户端套接字和数据recv),sizeof(数据recv),0;
}
printf(“%c\n”,data_recv);//打印0
关闭(客户端_套接字);//关闭客户端套接字
返回0;
}
服务器端代码:

#include <stdlib.h>

#include <sys/socket.h>
#include <sys/types.h>

#include <unistd.h>
#include <netinet/in.h>

int main()
{
    int server_socket;
    server_socket = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in server_address;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(8080);
    server_address.sin_addr.s_addr = INADDR_ANY;

    bind(server_socket, (struct sockaddr *) &server_address, sizeof(server_address));

    listen(server_socket, 5);
    while(1)
    {
        int client_socket;
        client_socket = accept(server_socket, NULL, NULL);
        for(int i = 1; i < 10 ; i++)             //first sending integers from 1 to 9
        {
            char c = i + 48;                    //performing integer to character conversion
            send(client_socket, &c, sizeof(c), 0);    //sending data to client
        }
        char c = 48;                      //store 0 in c (ASCII value of 0 is 48)
        send(client_socket, &c, sizeof(c), 0);  //send 0 to client
        printf("SENT DATA SUCCESSFULLY");       //print the message
    }
    close(server_socket);      //close the server socket
}
#包括
#包括
#包括
#包括
#包括
int main()
{
int-server_-socket;
服务器\u套接字=套接字(AF\u INET,SOCK\u STREAM,0);
服务器地址中的结构sockaddr\u;
服务器地址.sin\u family=AF\u INET;
服务器地址sin端口=htons(8080);
server_address.sin_addr.s_addr=INADDR\u ANY;
绑定(server_socket,(struct sockaddr*)和server_地址,sizeof(server_地址));
监听(服务器接口,5);
而(1)
{
int客户机接口;
客户端\u套接字=接受(服务器\u套接字,NULL,NULL);
for(int i=1;i<10;i++)//首先发送从1到9的整数
{
char c=i+48;//执行整数到字符的转换
send(client_socket,&c,sizeof(c),0);//向客户端发送数据
}
char c=48;//将0存储在c中(0的ASCII值为48)
send(client_socket,&c,sizeof(c),0);//将0发送到客户端
printf(“成功发送数据”);//打印消息
}
关闭(服务器_套接字);//关闭服务器套接字
}
问题:在运行该程序客户端的终端窗口上,我得到以下输出:

1-->2-->3-->4-->5-->6-->7-->8-->9-->0

因此,在客户端,我们可以清楚地看到0已被接收。这意味着服务器已成功地将所有数据发送到客户端

但是,问题出现在运行程序服务器端的终端窗口中。由于我们知道服务器已经发送了0(来自客户端终端窗口的输出),服务器端的终端窗口应该显示“已成功发送数据”。但是,它没有显示此消息(“已成功发送数据”)。服务器端的终端保持空白,不显示上述消息,即使0已成功发送到客户端

我想知道:

  • 为什么服务器端的终端窗口不显示该消息 “成功发送数据”
  • 如何解决这个问题
  • 谢谢你帮助我

    printf()不添加换行符,因此会打印文本,但您不会看到它,因为shell通常仅在看到换行符时才会输出文本

    因此,要么添加新行:

    printf("SENT DATA SUCCESSFULLY\n");
    
    (请注意字符串中的\n)

    或在不需要换行符时刷新输出,例如使用fflush(3)函数。

    printf()不添加换行符,因此会打印文本,但您不会看到它,因为shell通常仅在看到换行符时才会输出文本

    因此,要么添加新行:

    printf("SENT DATA SUCCESSFULLY\n");
    
    (请注意字符串中的\n)


    或者在不需要换行符时,使用fflush(3)函数刷新输出。

    printf
    printf(“已成功发送数据”)
    printf
    添加换行符:
    printf(“已成功发送数据\n”)最好解释一下为什么需要这样做。终端通常处于一种模式,只有在看到换行符后才输出文本(google表示Unix shell的原始模式和熟模式)。我知道这一点。但既然你提供了一个答案,那么最好在你的答案中包含这一点,以及如何在人们真的不想换行的情况下换行。好主意。编辑了我的答案。谢谢你的帮助。我不知道这一事实。最好解释一下为什么需要这样做。终端通常处于一种模式,只有在看到换行符后才输出文本(谷歌表示Unix shell的原始模式和熟模式)。我知道这一点。但既然你提供了一个答案,那么最好在你的答案中包含这一点,以及如何在人们真的不想换行的情况下换行。好主意。编辑了我的答案。谢谢你的帮助。我不知道这个事实。