echo服务器返回相同的输入多次 [英] echo server returning the same input many times

查看:355
本文介绍了echo服务器返回相同的输入多次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

>



下面的代码为了使一个回波服务器(数据我写到stdout从我的电脑移动到服务器,并回到我的电脑)。问题是,虽然echo显示在客户端的终端上显示相同的数字



<$>

p $ p> 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<<成功回显客户端<< endl;
}
} // for循环结束
}

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; //这显示x为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 = ;

if(id == 0)
reflection(connfd);

else
continue;
}
}

client.cpp / p>

  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<<你写了<< n<< endl;

if(n> 0)
{
while(n> 0)
{
m = write(clifd,data,n);
n = n-m;
}
}

n = read(clifd,recvd,100);
cout<<服务器回显<< n<< endl;

if(n> 0)
{
while(n> 0)
{
m = fputs(data,stdout); //获得多次显示
cout<<m is<< m<< endl; //显示很多次
fflush(stdout);
n = n-m;
}
// cout<<< data<< endl;
}
}
}

/ p>

解决方案

fputs



返回值
成功时,返回非负值。
如果错误,函数返回EOF。



也许可以使用write来获取写入的字节数


I wrote the following code in order to make an echo server (data I write to stdout moves from my PC to server and back to my PC).The problem is that though echo is getting displayed on client's terminal it is being displayed same number of times as is its length.

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<<"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;
}
}

client.cpp

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;
    }
}
}

What is the problem?

解决方案

fputs

Return Value On success, a non-negative value is returned. On error, the function returns EOF.

Maybe use write instead to get the number of bytes written

这篇关于echo服务器返回相同的输入多次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆