C++ 回显服务器多次返回相同的输入
我编写以下代码是为了创建一个echo服务器(我写入标准输出的数据从我的PC移动到服务器,再返回PC)。问题是,尽管echo显示在客户端终端上,但显示的次数与其长度相同。 server.cppC++ 回显服务器多次返回相同的输入,c++,sockets,network-programming,C++,Sockets,Network Programming,我编写以下代码是为了创建一个echo服务器(我写入标准输出的数据从我的PC移动到服务器,再返回PC)。问题是,尽管echo显示在客户端终端上,但显示的次数与其长度相同。 server.cpp void reflect(int x) { int n; int m; char data[100]; cout<<"Entered reflect function"<<endl; for(;;) { n=read(x,data, 100); cout<<"Cli
void reflect(int x)
{
int n;
int m;
char data[100];
cout<<"Entered reflect function"<<endl;
for(;;)
{
n=read(x,data, 100);
cout<<"Client sent "<<n<<endl;
if(n>0)
{
while(n>0)
{
m=write(x,data,n);
n=n-m;
}
cout<<"Successfully echoed back to client"<<endl;
}
}//end of for loop
}
int main()
{
sockaddr_in serv;
bzero(&serv, sizeof(serv));
serv.sin_family=AF_INET;
serv.sin_port=htons(3345);
inet_aton("127.0.0.1", &(serv.sin_addr));
int servfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int x;
x=bind(servfd, (sockaddr*)(&serv), sizeof(serv));
cout<<"Bind returned"<<x<<endl; //this displays x as 0
listen(servfd, 5);
sockaddr cli;
int connfd;
pid_t id=-1;
socklen_t siz=sizeof(cli);
for(;;)
{
if((connfd=accept(servfd, &cli, &siz))>=0)
id=fork();
if(id==0)
reflect(connfd);
else
continue;
}
}
int main()
{
int clifd;
clifd=socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
sockaddr_in serv;
bzero(&serv, sizeof(serv));
serv.sin_family=AF_INET;
serv.sin_port=htons(3345);
inet_aton("127.0.0.1", &(serv.sin_addr));
connect(clifd, (sockaddr*)(&serv), sizeof(serv));
int n,m;
char data[100];
char recvd[100];
for(;;)
{
fgets(data, 100,stdin );
n=strlen(data);
cout<<"You have written "<<n<<endl;
if(n>0)
{
while(n>0)
{
m=write(clifd,data,n);
n=n-m;
}
}
n=read(clifd, recvd, 100);
cout<<"Server echoed back "<<n<<endl;
if(n>0)
{
while(n>0)
{
m=fputs(data,stdout); //gets displayed many times
cout<<"m is"<<m<<endl; //gets displayed many times
fflush(stdout);
n=n-m;
}
//cout<<data<<endl;
}
}
}
void反射(int x)
{
int n;
int m;
字符数据[100];
coutfputs
返回值
成功时,将返回一个非负值。
出现错误时,函数返回EOF
可能使用write来获取写入的字节数fputs
打印一个C字符串,而不是一个字符,因此在while循环中,每个字符只打印一次整个字符串。此外,它依赖于以null结尾的字符串,而不是以null结尾的字符串。您知道长度,因此可能可以强制自己的null termination或更好的方法仍然是创建一个带有起始和长度的std::string
。此代码实际上试图打印数组中字节数的数据。它将返回写入的字节数,即4。我认为您不需要put()和fflush在一个循环中。您可以调用它们一次。若您仍然希望使用while循环,可能是您可以检查返回值(m)并和数据长度(n)进行比较,若它们相等,则从循环中断
Last while循环可以替换为
fputs(data,stdout);
fflush(stdout);
希望这有帮助。如果新数据到达或未到达,请处理缓冲区
您可以在读取数据的位置进行更改:
for(;;)
{
if(fgets(data, 100,stdin )) { /* only process the data, when something arrived. */
n=strlen(data);
cout<<"You have written "<<n<<endl;
...
(;;)的
{
if(fgets(data,100,stdin)){/*仅在某些数据到达时处理数据*/
n=strlen(数据);
coutstrlen()函数给出输入中的字符数,不包括终止C样式字符串的零字节。您只向服务器写入n个字节(没有空终止符)。然后读取从服务器返回的n个字符,并且从不设置recvd缓冲区的剩余部分。因此,在找到零之前,它将打印内存中的任何垃圾