为什么我得到一个糟糕的文件描述符错误
Why am I getting a bad file descriptor error?
我正在尝试编写一个像客户端一样的短程序,如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.0rnHost: ";
char end[] = "rnrn";
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);
}
谢谢!
您的代码中有缓冲区溢出。您正在尝试将一堆字符数组分配到一个只有5字节长的缓冲区中:
char get[] = "GET "; // 'get' is 5 bytes long
char http[] = " HTTP/1.0rnHost: ";
char end[] = "rnrn";
strcat(get, URI); // BOOM!
strcat(get, http);
strcat(get, strHostName);
strcat(get, end);
这可能会覆盖您的本地变量hSocket
,从而导致"错误的文件描述符错误"。
因为你正在使用c++(你有一个vector
在你的代码),只是使用std::string
代替字符的C数组,这样你就不必担心内存管理
另一个导致'错误的文件描述符'的原因可能是当您试图写入没有写入权限的位置时。例如,当尝试在Windows环境中使用wget下载内容时:Cannot write to 'ftp.org.com/parent/child/index.html' (Bad file descriptor).
另一种情况可能是目标输出文件名包含文件系统不允许的字符。例如,假设您在一台Linux计算机上运行wget命令,目标路径是一个用NTFS格式化的外部硬盘驱动器。Linux Ext4文件系统将允许诸如'?’,但NTFS文件系统不会。wget的默认行为是将目标文件夹命名为指定的url。如果url包含像":"这样的特殊字符,NTFS将不接受该字符,导致错误"错误的文件描述符"。您可以使用——no-host-directories参数在wget中禁用此默认行为。
'坏文件描述符'的另一个原因可能是意外地试图将()写入只读描述符。我被困了一段时间,因为我花了所有的时间寻找第二个close()或缓冲区溢出。
- 使用VerQueryValue检索应用程序的文件描述
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- I2C 文件描述符上的 I2C 总线可写/可读标志
- 许多文件描述符在调用sys_clone时
- AMQP-CPP >处理程序中的错误文件描述符
- 如何使用 WINAPI 和 C++ 提取可执行文件的文件描述?
- 正在等待在非阻塞文件描述符上长时间运行ioctl
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 如何强制文件描述符缓冲我的输出
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- 哪个更适合从C++写入敏感的日志文件,在文件描述符上写()或文件上的fprintf()?
- 将 select() 与非基于文件描述符的输入一起使用
- accept(..) 似乎正在修改我给它的文件描述符参数
- 使用 Select 多路复用未命名的管道和其他文件描述符
- 提升 ASIO 绑定:错误的文件描述符
- 使用文件描述符移动对象
- 无法从零MQ ZMQ_SERVER套接字中获取文件描述符
- read() 上的不同行为取决于写入不可写内存时表示文件、匿名管道或套接字的文件描述符
- 我可以在不使用 FIOCANCEL 的情况下关闭 VxWorks 中的文件描述符吗?
- 将 Boost Asio 与 ZeroMQ 集成,文件描述符错误?