为什么程序运行在if((hptr = gethostbyname(buffer)) == NULL)时就崩溃了
Why is the program broken down when it runs at if((hptr = gethostbyname(buffer)) == NULL)
这是一个socket通信的服务器。当客户端向服务器发送URL时,服务器将IP发送给客户端。当它运行 hptr = gethostbyname(buffer)
时,它总是 returns NULL
。为什么?谢谢!
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
int main( int argc, char *argv[] )
{
int sockfd, streamfd, addr_size, status;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
struct in_addr **addr_list;
struct hostent *hptr;
char *ptr, **pptr;
char str[32];
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("ERROR opening socket");
exit(1);
}
/* Initialize socket structure */
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = PF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(1234);
/* Now bind the host address using bind() call.*/
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
{
perror("ERROR on binding");
exit(1);
}
/* Now start listening for the clients, here process will
* go in sleep mode and will wait for the incoming connection
*/
listen(sockfd,10);
addr_size = sizeof(cli_addr);
/* Accept actual connection from the client */
while(1){
streamfd = accept (sockfd, (struct sockaddr *) &cli_addr, &addr_size);
status = read (streamfd, buffer, 255);
printf ("string from net: %s\n", buffer);
if((hptr = gethostbyname(buffer)) == NULL)
{
printf("gethostbyname error for host:%s\n", buffer);
return 0;
}
printf("IP Address:%s\n",inet_ntoa(*((struct in_addr *)hptr->h_addr)));
close(streamfd);
}
return 0;
}
出于某种原因,您认为:
read
总是成功并且 returns 你是一个完整的 chunk 发件人在一次 send
调用中发送的。
- 读取的数据以零结尾。
这两个假设都不正确。
您需要确保您阅读了完整的消息或一行(无论您的线路协议如何)并且您的字符串是以零结尾的(人们通常不会通过线路发送零终止符)。
发布的代码甚至都无法编译。
1) bzero() needs (note the plural 'strings')
#include <strings.h> for bzero()
2) accept() parameter 3 has incorrect signedness
3) accept() return parameter should be socklen_t* but is int*
4) on linux for read() needs
#include <unistd.h>
5) inet_ntoa() needs
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
6) several unused variables and parameters.
7) variable 'status' set but not used
强烈建议在编译时启用所有警告
(对于 gcc,至少,'-Wall -Wextra -pedantic')
然后修复警告。
为了我们人类的可读性,请始终如一地缩进代码
许多系统函数 return 可用于确定操作是否成功的值。 read()就是这样一个函数。
代码需要对来自 read()
的 returned 值执行错误检查
这是一个socket通信的服务器。当客户端向服务器发送URL时,服务器将IP发送给客户端。当它运行 hptr = gethostbyname(buffer)
时,它总是 returns NULL
。为什么?谢谢!
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
int main( int argc, char *argv[] )
{
int sockfd, streamfd, addr_size, status;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
struct in_addr **addr_list;
struct hostent *hptr;
char *ptr, **pptr;
char str[32];
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("ERROR opening socket");
exit(1);
}
/* Initialize socket structure */
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = PF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(1234);
/* Now bind the host address using bind() call.*/
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
{
perror("ERROR on binding");
exit(1);
}
/* Now start listening for the clients, here process will
* go in sleep mode and will wait for the incoming connection
*/
listen(sockfd,10);
addr_size = sizeof(cli_addr);
/* Accept actual connection from the client */
while(1){
streamfd = accept (sockfd, (struct sockaddr *) &cli_addr, &addr_size);
status = read (streamfd, buffer, 255);
printf ("string from net: %s\n", buffer);
if((hptr = gethostbyname(buffer)) == NULL)
{
printf("gethostbyname error for host:%s\n", buffer);
return 0;
}
printf("IP Address:%s\n",inet_ntoa(*((struct in_addr *)hptr->h_addr)));
close(streamfd);
}
return 0;
}
出于某种原因,您认为:
read
总是成功并且 returns 你是一个完整的 chunk 发件人在一次send
调用中发送的。- 读取的数据以零结尾。
这两个假设都不正确。
您需要确保您阅读了完整的消息或一行(无论您的线路协议如何)并且您的字符串是以零结尾的(人们通常不会通过线路发送零终止符)。
发布的代码甚至都无法编译。
1) bzero() needs (note the plural 'strings')
#include <strings.h> for bzero()
2) accept() parameter 3 has incorrect signedness
3) accept() return parameter should be socklen_t* but is int*
4) on linux for read() needs
#include <unistd.h>
5) inet_ntoa() needs
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
6) several unused variables and parameters.
7) variable 'status' set but not used
强烈建议在编译时启用所有警告
(对于 gcc,至少,'-Wall -Wextra -pedantic')
然后修复警告。
为了我们人类的可读性,请始终如一地缩进代码
许多系统函数 return 可用于确定操作是否成功的值。 read()就是这样一个函数。
代码需要对来自 read()
的 returned 值执行错误检查