C++ 为什么会出现错误的文件描述符错误?

C++ 为什么会出现错误的文件描述符错误?,c++,sockets,client,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]; un

我正在尝试编写一个类似于客户端的短程序,比如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);
} 
struct hostent*pHostInfo;
地址中的结构sockaddr_;
长地址;
char pBuffer[缓冲区大小];
未签名的nReadAmount;
int nHostPort=atoi(端口);
矢量头线;
字符缓冲区[MAX_MSG_SZ];
char contentType[MAX_MSG_SZ];
int hSocket=套接字(AF_INET、SOCK_STREAM、IPPROTO_TCP);
if(hSocket==套接字错误)
{
cout h_长度);
Address.sin_addr.s_addr=nHostAddress;
地址:sinu port=htons(nHostPort);
Address.sin_family=AF_INET;
if(connect(hSocket,(struct sockaddr*)&Address,sizeof(Address))==SOCKET\u错误)
{
cout您的代码中有一个。您试图将一组字符数组一起分配到一个缓冲区中,该缓冲区的长度仅为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++(你的代码中有一个<代码>向量>代码>,只需使用<代码> STD::String 代替C字符数组,这样你就不必担心内存管理。

< P>另一个“坏文件描述符”的原因可能是意外地试图写()一个只读描述符。我被困在这个问题上有一段时间了,因为我一直在寻找第二个结束()或缓冲区溢出。

尝试写入到您没有写入权限的位置时,可能会遇到另一个导致“文件描述符错误”的原因。例如,尝试在Windows环境中下载内容时:
无法写入“ftp.org.com/parent/child/index.html”(错误的文件描述符)。