UDP连接中的第一个缓冲区包含垃圾-后续连接很好

杜克先生

真的要尽量避免在这里发布整个项目-除非需要:)我有一个客户端/服务器程序,我正在编写一个客户端/服务器程序,该客户端通过UDP端口与服务器联系,并期望在其中接收数据包。格式"@7777~15~3701"-第一次连接时,缓冲区中出现垃圾。但是,一旦客户端退出,然后我再次启动它,下一个缓冲区"@7777~15~3702"就可以了。

int
RoutingManager::SendMessage(struct sockaddr_in toNode, char buffer[1024])
{
    #if logging > 1
        cout << "Sending: " << buffer << endl;
    #endif

    int n;
    unsigned int length = sizeof(struct sockaddr_in);
    //buffer = "@7777~15~3702"
    n = sendto(mySocket, buffer, strlen(buffer),0,
                (const struct sockaddr *)&toNode,length);

    if (n < strlen(buffer))
        perror("Sendto");

    cout << "Sent: " << n << " bytes of data\n";
}

..我在这里传递的缓冲区是从以下位置生成的:

//FIXED: This was the source of my issue it appears - a corrected
//implementation of this method has been included at the bottom.
char*
RoutingManager::GenerateConnectionString(struct Node n)
{
    char buffer[512];
    bzero(buffer,512);
    sprintf(buffer, "@7777~15~%d", n.id);
    cout << MYPORT << endl;
    return buffer;
}

服务器输出:

Sending: @7777~15~3701
Sent: 1 bytes of data
Waiting for nodes...

客户端:

RoutingNode::GetMyID()
{
    int n;
    char buffer[256];
    bzero(buffer,256);
    unsigned int length = sizeof(struct sockaddr_in);
    struct sockaddr_in from;

    n = sendto(mySocket,"!", strlen("!"),0,(const struct sockaddr *)&server,length);

    if (n < 0) 
        perror("Sendto");

    //once we have our information from the manager, let's hog some cpu
        //remove this crap when stuff gets more reliable
        fcntl(mySocket, F_SETFL, O_NONBLOCK);

    while(buffer[0] != '@')
        n = recvfrom(mySocket,buffer,256,0,(struct sockaddr *)&from, &length);

    if (n < 0) 
        perror("recvfrom");

    parser.ParseMessage(buffer, fromNode, messages);
}

当我解析消息时:

bool
RoutingMessage::ParseMessage(char* buffer, int &fromNode, map<int, string> &messages, const int MAX_CHARS_PER_LINE, 
                                const int MAX_TOKENS_PER_LINE, const char* const DELIMITER)
{
    #if logging > 1
        cout << "Buffer: " << buffer << endl;
    #endif

    if (buffer[0] != '@')
    {
        perror("Buffer malformated!");
        return false;
    }

    //remove the '@'
    buffer++;

    char buf[MAX_CHARS_PER_LINE];
    strcpy(buf, buffer);
    char* temp = strtok(buf, DELIMITER);
    if (temp == NULL)
    {
        perror("Buffer malformated!");
        return false;
    }

    fromNode = atoi(temp);
    temp = strtok(NULL, DELIMITER);

    vector<string> tokens;
    while(temp != NULL)
    {
        string val(temp);
        tokens.push_back(val);
        temp = strtok(NULL, DELIMITER);
    }

    //store messages in the map: <message-type>, <message>
    for (int i = 0; i < tokens.size(); i+=2)
        messages.insert(pair<int, string>(atoi(tokens[i].c_str()), tokens[i+1]));

    //all good
    return true;
}

并输出结果,我变得很烂:

Buffer: <junk-symbol>
Buffer malformated!: Success
Node: 0

但是,当客户端断开连接并重新启动相同的可执行文件时,我得到:

Buffer: @7777~15~3702
Node: 7777
Message Type: 15 Message: 3702

正如我所期望的。有人知道我可以检查的东西吗?

更正的方法-

void
RoutingManager::GenerateConnectionString(struct Node n, char* buffer)
{
    bzero(buffer,512);
    sprintf(buffer, "@7777~15~%d", n.id);
}

以上似乎解决了我的问题。

滑雪

问题似乎在GenerateConnectionString()起作用:

char*
RoutingManager::GenerateConnectionString(struct Node n)
{
    char buffer[512];
    ....
    return buffer;
}

它返回一个指向局部变量的指针。因此,返回的指针指向堆栈。因此,当程序使用该区域的堆栈时,数据将在以后损坏。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

第一个套接字连接来自远程 IP 为 0.0.0.0,所有后续连接都正常

来自分类Dev

Node.js:在第一个连接回调中连接并“ writeHead”

来自分类Dev

后续连接中TCP缓慢启动的原因

来自分类Dev

从第一个到最后一个连接,但在另一列中连接

来自分类Dev

TCP连接缓冲区

来自分类Dev

SQL 两个左连接只产生第一个表中的数据

来自分类Dev

Teradata - 两个表之间的连接 - 保留第一个表中的值

来自分类Dev

UDP未连接套接字发送失败,直到接收到第一个数据报

来自分类Dev

缓冲区溢出的第一个实验

来自分类Dev

缓冲区溢出的第一个实验

来自分类Dev

连接多个表并汇总第一个表中每一行的结果

来自分类Dev

session_status()发出第一个连接

来自分类Dev

连接SQL查询返回第一个表

来自分类Dev

设备间连接的第一个项目入门

来自分类Dev

JasperReport 连接只打印第一个报告

来自分类Dev

Javascript:很好的人类可读的列表连接

来自分类Dev

SQL 连接,其中第二个表中的值是第一个表中的第一个较低值

来自分类Dev

ReactiveX RxSwift从可观察对象的连接中获取第一个非错误

来自分类Dev

连接表,但确保返回第一个表中的所有行

来自分类Dev

通过比较第一个元素 Python 连接列表中的列表

来自分类Dev

连接字符串中单词的第一个字符

来自分类Dev

在gnuplot中,第一个点和最后一个点相互连接

来自分类Dev

Vim Ack在当前缓冲区中打开第一个文件

来自分类Dev

python27 matplotlib:连接的第一个和最后一个元素

来自分类Dev

R:删除连接第一个和最后一个点的线

来自分类Dev

连接列表的最后一个和第一个值

来自分类Dev

Node.js:在第一个连接回调中进行连接和“ writeHead”

来自分类Dev

为什么一个YII博客可以很好地连接到sqlite而不是mysql?

来自分类Dev

将列表中除第一个元素外的所有元素连接到字符串

Related 相关文章

  1. 1

    第一个套接字连接来自远程 IP 为 0.0.0.0,所有后续连接都正常

  2. 2

    Node.js:在第一个连接回调中连接并“ writeHead”

  3. 3

    后续连接中TCP缓慢启动的原因

  4. 4

    从第一个到最后一个连接,但在另一列中连接

  5. 5

    TCP连接缓冲区

  6. 6

    SQL 两个左连接只产生第一个表中的数据

  7. 7

    Teradata - 两个表之间的连接 - 保留第一个表中的值

  8. 8

    UDP未连接套接字发送失败,直到接收到第一个数据报

  9. 9

    缓冲区溢出的第一个实验

  10. 10

    缓冲区溢出的第一个实验

  11. 11

    连接多个表并汇总第一个表中每一行的结果

  12. 12

    session_status()发出第一个连接

  13. 13

    连接SQL查询返回第一个表

  14. 14

    设备间连接的第一个项目入门

  15. 15

    JasperReport 连接只打印第一个报告

  16. 16

    Javascript:很好的人类可读的列表连接

  17. 17

    SQL 连接,其中第二个表中的值是第一个表中的第一个较低值

  18. 18

    ReactiveX RxSwift从可观察对象的连接中获取第一个非错误

  19. 19

    连接表,但确保返回第一个表中的所有行

  20. 20

    通过比较第一个元素 Python 连接列表中的列表

  21. 21

    连接字符串中单词的第一个字符

  22. 22

    在gnuplot中,第一个点和最后一个点相互连接

  23. 23

    Vim Ack在当前缓冲区中打开第一个文件

  24. 24

    python27 matplotlib:连接的第一个和最后一个元素

  25. 25

    R:删除连接第一个和最后一个点的线

  26. 26

    连接列表的最后一个和第一个值

  27. 27

    Node.js:在第一个连接回调中进行连接和“ writeHead”

  28. 28

    为什么一个YII博客可以很好地连接到sqlite而不是mysql?

  29. 29

    将列表中除第一个元素外的所有元素连接到字符串

热门标签

归档