C++ 为什么会出现错误的文件描述符错误?
我正在尝试编写一个类似于客户端的短程序,比如telnet。 我从用户输入中收到如下信息:www.google.com 80(端口号)和/index.html 然而,我得到了一些错误。当我写一些调试信息时,它说我有一个错误的文件描述符,在文件描述符100 messagesize=0上读取失败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
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字节:
代替C字符数组,这样你就不必担心内存管理。 < P>另一个“坏文件描述符”的原因可能是意外地试图写()一个只读描述符。我被困在这个问题上有一段时间了,因为我一直在寻找第二个结束()或缓冲区溢出。尝试写入到您没有写入权限的位置时,可能会遇到另一个导致“文件描述符错误”的原因。例如,尝试在Windows环境中下载内容时:这可能会覆盖局部变量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
无法写入“ftp.org.com/parent/child/index.html”(错误的文件描述符)。