【问题标题】:ACE c++ send_n and recv_n not working as expectedACE c++ send_n 和 recv_n 未按预期工作
【发布时间】:2017-03-16 18:51:33
【问题描述】:

我正在尝试使用 ACE 实现一个基本的客户端-服务器程序,但问题是如果我从客户端发送并从服务器接收它,它可以正常工作。但是,当我增加复杂性时,即多次发送和接收时,程序不起作用。任何帮助表示赞赏。

这是客户端代码。

    #include "ace/SOCK_Acceptor.h"
#include "ace/SOCK_Connector.h"
#include "ace/SOCK_Stream.h"
#include "iostream"
using namespace std;
int main(){
    ACE_INET_Addr server(7128);
    ACE_SOCK_Connector cli;
    ACE_SOCK_Stream cstream;
    if(cli.connect(cstream, server)==-1){perror("Error");}
    char buff[100];
    if(-1==cstream.recv_n(buff, 7)){printf("Error");}
    cout<<buff<<endl;
    cstream.send_n("FU", 3);
    }

这是服务器代码

#include "ace/SOCK_Acceptor.h"
#include "ace/SOCK_Connector.h"
#include "ace/SOCK_Stream.h"
#include "iostream"
using namespace std;
int main(){
    ACE_INET_Addr server(7128);
    ACE_INET_Addr client;
    ACE_SOCK_Acceptor cli(server);
    ACE_SOCK_Stream cstream;
    if(cli.accept(cstream, &client)==-1){perror("Error");}
    char buff[100];
    if(-1==cstream.send_n("RAND", 5)){printf("Error");}
    cstream.recv_n(buff, 3);
    }

【问题讨论】:

    标签: c++ network-programming ace


    【解决方案1】:

    您的服务器正在发送 5 个字节,但您的客户端期望读取 7 个字节。客户端被阻止等待另外 2 个永远不会到来的字节。

    【讨论】:

    • 如何通过套接字发送整数值?不像字符数组。我想在不知道预定义长度的情况下发送它。
    • 通过套接字发送一个整数长度值会打开另一个蠕虫罐。现在,只需尝试将服务器的 send_n 参数更改为 ("RANDY!"​​, 7)。对于长度等更大的问题,请参阅我/Doug Schmidt 的书“C++ 网络编程,第 1 卷”第 4 章。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多