无法确认在C中完成从服务器端到客户端的数据发送
我不熟悉C语言的套接字编程。我已经编写了一个服务器端程序和一个客户端程序。其功能描述如下: 服务器端:服务器向客户端发送1到9的整数,发送9后发送0。将0成功发送到客户端后,服务器应在运行服务器端的终端窗口上打印(而不是发送)“成功发送数据”,这是对服务器已将1发送到9,然后将0成功发送到客户端这一事实的确认 客户端:客户端应该显示服务器发送的所有整数。因为我们知道我们将接收从1到9再到0的整数,所以客户端的预期输出应该是:无法确认在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--
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("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的原始模式和熟模式)。我知道这一点。但既然你提供了一个答案,那么最好在你的答案中包含这一点,以及如何在人们真的不想换行的情况下换行。好主意。编辑了我的答案。谢谢你的帮助。我不知道这个事实。