echo服务器返回相同的输入多次 [英] echo server returning the same input many times
本文介绍了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屋!
查看全文