Почему я получаю ошибку дескриптора файла? - PullRequest
2 голосов
/ 13 сентября 2011

Я пытаюсь написать короткую программу, которая работает как клиент, как telnet. Я получаю от пользователя такие данные: www.google.com 80 (номер порта) и /index.html Однако я получаю некоторые ошибки. Когда я записываю некоторую отладочную информацию, он говорит, что у меня неверный дескриптор файла и Read Failed на дескрипторе файла 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);
} 

Спасибо!

Ответы [ 2 ]

6 голосов
/ 13 сентября 2011

В вашем коде переполнение буфера . Вы пытаетесь выделить кучу символьных массивов вместе в буфер, длина которого составляет всего 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, чтобы вам не пришлось беспокоиться об управлении памятью.

0 голосов
/ 20 октября 2018

Другой причиной 'плохого дескриптора файла' может быть случайная попытка записи () в дескриптор только для чтения.Я застрял на этом некоторое время, потому что я тратил все свое время на поиски второго закрытия () или переполнения буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...