c++ - 为什么我会收到错误的文件描述符错误?

标签 c++ sockets client

我正在尝试编写一个像客户端一样运行的简短程序,例如 telnet。 我从用户那里收到这样的输入:www.google.com 80(端口号)和/index.html 但是,我收到一些错误。当我写一些调试信息时,它说我有一个错误的文件描述符,并且在文件描述符 100 messagesize = 0 上读取失败。

struct hostent * pHostInfo;
struct sockaddr_in Address;
long nHostAddress;
char pBuffer[BUFFER_SIZE];
unsigned nReadAmount;
int nHostPort = atoi(port);

vector<char *> headerLines;
char buffer[MAX_MSG_SZ];
char contentType[MAX_MSG_SZ];

int hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (hSocket == SOCKET_ERROR)
{
  cout << "\nCould Not Make a Socket!\n" << endl;
  return 1;
}
pHostInfo = gethostbyname(strHostName);
memcpy(&nHostAddress,pHostInfo -> h_addr, pHostInfo -> h_length);

Address.sin_addr.s_addr = nHostAddress;
Address.sin_port=htons(nHostPort);
Address.sin_family = AF_INET;

if (connect(hSocket, (struct sockaddr *)&Address, sizeof(Address)) == SOCKET_ERROR)
{
  cout << "Could not connect to the host!" << endl;
  exit(1);
}
char get[] = "GET ";
char http[] = " HTTP/1.0\r\nHost: ";
char end[] = "\r\n\r\n";
strcat(get, URI);
strcat(get, http);
strcat(get, strHostName);
strcat(get, end);
strcpy(pBuffer, get);
int len = strlen(pBuffer);
send(hSocket, pBuffer, len, 0);
nReadAmount = recv(hSocket,pBuffer, BUFFER_SIZE, 0);
//Parsing of data here, then close socket
if (close(hSocket) == SOCKET_ERROR)
{
  cout << "Could not close the socket!" << endl;
  exit(1);
} 

谢谢!

最佳答案

你有一个 buffer overrun在你的代码中。您正在尝试将一堆字符数组一起分配到一个只有 5 个字节长的缓冲区中:

char get[] = "GET ";  // 'get' is 5 bytes long
char http[] = " HTTP/1.0\r\nHost: ";
char end[] = "\r\n\r\n";
strcat(get, URI);  // BOOM!
strcat(get, http);
strcat(get, strHostName);
strcat(get, end);

这可能会覆盖您的局部变量 hSocket,从而导致“文件描述符错误”。

由于您使用的是 C++(您的代码中有一个 vector),只需使用 std::string 而不是 C 字符数组,这样您就不会不必担心内存管理。

关于c++ - 为什么我会收到错误的文件描述符错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7406290/

相关文章:

javascript - 向我展示代码而不是实际运行它

c++ - 开始 c++ : OOP Methodologies and more

c++ - 具有相同名称但参数类型不同的多个函数作为模板参数

c++ - 实用的 C++ 套接字或虚拟机?

C Sock 编程中的 Accept 问题

c++ - Socket 客户端始终连接到本地主机

html - 使用Qwebview将数据发送到嵌入在QT gui中的html网站

c++ - 基于clang的跨平台C++ IDE?

Java Server SSL Socket 和 Python Client SSL socket - 服务器发送消息时出现问题

.net - 是否有为 .NET 实现的 WebSocket 客户端?