TCP数据包真的很奇怪

时间:2015-10-02 19:54:52

标签: c++ tcp packet

我正在编写一个小命令行工具来与客户端进行交互(游戏,没有任何违法行为,只是试验),主要是通过HTTP。 我不久前写了这个工具的旧版本,遇到了一些我现在修复过的问题。

这就是为什么我想重写我的代码以使其更清晰,更好。但是现在我遇到了一些非常有线的问题而无法找到原因。

我在使用XCode的Mac上完成所有这些操作。我发送服务器(我是服务器)版本(纯文本HTML)时出现问题。奇怪的是,我从旧版本中复制/粘贴了那部分代码,即使我现在运行它也能正常工作。 所以我有两个完全相同代码的程序,但只有一个程序正常工作。

这是程序:

  1. 打开套接字并绑定到特定端口,等待客户端。
  2. 如果客户端要求提供服务器版本,请使用纯HTML +版本号
  3. 进行响应
  4. 完成。
  5. 2个程序,相同的代码,不同的结果:

    旧版本:客户端正确读取版本号 新版本:客户端无法读出版本号

    这是通过套接字写入数据的代码(请记住这是旧版本的旧丑代码):

    int socketWriteNormal_Old(int socket, std::string data, int mode, char final_buffer[], int bytes){
        if(mode == 0){
            char buffer[512];
            int error;
            std::string chunk;
    
            if(data.length() > 511){
                while(data.length() > 0){
                    if(data.length() >= 511){
                        chunk = data.substr(0,511);
                        data = data.substr(511, data.length());
                    }
                    else{
                        chunk = data;
                        data = "";
                    }
                    bzero(buffer, 512);
                    chunk.copy(buffer, chunk.length());
                    error = write(socket, buffer, strlen(buffer));
                    if(error < 0){
                        return error;
                    }
                }
            }
            else{
                bzero(buffer,512);
                data.copy(buffer,512);
                error = write(socket, buffer, strlen(buffer));
            }
    
            return error;
        }
        else{
            int error = write(socket, final_buffer, bytes);
    
            std::cout << final_buffer << " " << bytes << std::endl;
            std::cout << error << std::endl;
    
            return error;
        }
    }
    

    这是我在端口上监听的方式(连接似乎适用于两个版本):

    int socketListen(int socket, int port){
    
        struct sockaddr_in serv_addr, cli_addr;
    
        int newsock;
    
        socklen_t clilen;
    
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        serv_addr.sin_port = htons(port);
    
        std::cout << "[socketListen] Binding server_socket to port " << port << std::endl;
    
        if(bind(socket, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0){
            return -1;
        }
    
        std::cout << "[socketListen] Running Listen()" << std::endl;
    
        listen(socket,5);
        clilen = sizeof(cli_addr);
        std::cout << "[socketListen] running accept()" << std::endl;
        newsock = accept(socket, (struct sockaddr *) &cli_addr, &clilen);
        std::cout << "[socketListen] got new socket!" << std::endl;
        if(newsock < 0){
            return -2;
        }
        else{
            return newsock;
        }
    }
    

    这是使用新版本和旧版本创建的两个数据包的whireshark的数据包转储。

    旧版和工作版:

    enter image description here

    新版本和不可用版本:

    enter image description here

    正如你所看到的,没有区别......或者至少我找不到一个。这真的让我发疯,从未遇到过这样的奇怪问题。

    另外,在新版本中,我遇到了另一个问题。该工具具有第二个功能,可从服务器下载特定数据,也可以是普通的HTTP和二进制数据。奇怪的是,当我从命令行运行程序时,我在3-6秒后得到一个段错误,但是当我在XCode / gdb上运行它时它确实工作正常......

    如果有人有同样的奇怪问题或对此有所了解,请帮助我。

0 个答案:

没有答案