我正在编写一个小命令行工具来与客户端进行交互(游戏,没有任何违法行为,只是试验),主要是通过HTTP。 我不久前写了这个工具的旧版本,遇到了一些我现在修复过的问题。
这就是为什么我想重写我的代码以使其更清晰,更好。但是现在我遇到了一些非常有线的问题而无法找到原因。
我在使用XCode的Mac上完成所有这些操作。我发送服务器(我是服务器)版本(纯文本HTML)时出现问题。奇怪的是,我从旧版本中复制/粘贴了那部分代码,即使我现在运行它也能正常工作。 所以我有两个完全相同代码的程序,但只有一个程序正常工作。
这是程序:
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的数据包转储。
旧版和工作版:
新版本和不可用版本:
正如你所看到的,没有区别......或者至少我找不到一个。这真的让我发疯,从未遇到过这样的奇怪问题。
另外,在新版本中,我遇到了另一个问题。该工具具有第二个功能,可从服务器下载特定数据,也可以是普通的HTTP和二进制数据。奇怪的是,当我从命令行运行程序时,我在3-6秒后得到一个段错误,但是当我在XCode / gdb上运行它时它确实工作正常......
如果有人有同样的奇怪问题或对此有所了解,请帮助我。