c++ - echo 服务器多次返回相同的输入

标签 c++ sockets network-programming

enter image description here

我写了下面的代码来制作一个回显服务器(我写到标准输出的数据从我的电脑移动到服务器再回到我的电脑)。问题是虽然回显显示在客户端的终端上显示的次数与其长度相同。

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

客户端.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;
    }
}
}

问题是什么?

最佳答案

输出

返回值 成功时,返回一个非负值。 出错时,该函数返回 EOF。

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

关于c++ - echo 服务器多次返回相同的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11420177/

相关文章:

c++ - 图像每一行在 x 方向上的一维卷积

c++ - SSL 与加密套接字

c - 通过 TCP 客户端套接字接收数据时出现问题

javascript - Node.js UDP 网络多播

linux - 如何将原始 L2 数据包作为传入数据包注入(inject) Linux 上的接口(interface)?

c++ - 在其他计算机上运行 Allegro 5

c++ - C++ 中 ^ 运算符的作用是什么

Android 中的 Java,帮助连接到 wifi 网络,并在不成功时尝试重新连接

c++ - 为特定迭代器类型重载 for_each

java - Java 局域网游戏