在C:connect中调试使用套接字程序时出现问题

时间:2010-11-07 01:51:18

标签: c debugging sockets kdbg

我正在使用unix套接字编写一个简单的客户端 - 服务器系统。从终端执行时,我的客户端程序会产生分段错误。

我很确定seg-fault是由一些noob错误引起的,但是当我尝试使用KDBG(kde gdb frontend)调试它时,我的问题出现了。

这就是它破裂的地方:

 if (DEBUG) printf("-- connect()... \n");
 if (connect (mySocket, (struct sockaddr *)socketAddr,sizeof (*socketAddr)) == -1) {
  perror(error);
  printf("%s\n",error);
  printf ("-- Error when stablishing a connection\n");
  return -1;
 }

这是输出:

-- connect()... 
Connection refused

-- Error when stablishing a connection

我不能这样调试这段代码吗?为什么呢?

如果我能,你现在在那里有什么好事吗?我该怎么做才能获得更多信息?

PS: PS:@abelenky:该部分在调试器之外完美运行。这是socketAddr的声明:

struct sockaddr_in socketAddr; 

... 

if ( (mySocket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    printf("Error al crear el socket\n"); 
    return -2; 
}

1 个答案:

答案 0 :(得分:0)

这些函数需要一个字符串,而你正在传递其他内容。

例如:

perror("socket");

虽然我不知道您的代码中声明了error ...也许您正在考虑全局变量errno,它是整数?

顺便说一下,perror大致相当于:

void perror(const char *str)
{
    fprintf(stderr, "%s: %s\n", str, strerror(errno));
}

根据评论更新:

在这种情况下,我的猜测是你没有把error任何东西都搞砸了......我不确定你期望在error中有什么,但是你可能想尝试一下:

snprintf(error, sizeof(error), "Error in %s:%d\n", __FILE__, __LINE__);
perror(error);

更新2:

我想你想要这个:

if (connect (mySocket, (struct sockaddr *)&socketAddr, sizeof (socketAddr)) == -1) {

请注意,我在&之前添加了socketAddr,并从*中删除了sizeof

你是如何进行主机名查找的?我推荐getaddrinfo,例如:

struct addrinfo *res = NULL, hint;
char service[32];
int error;

snprintf(service, sizeof(service), "%d", port);

memset(&hint, 0, sizeof(hint));
hint.ai_socktype = SOCK_STREAM;

if ((error = getaddrinfo(host, service, &hint, &res)))
{
   fprintf(stderr, "No se pudo encontrar %s: %s\n", host, gai_strerror(error));
}
else
{
   fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
   if (fd < 0)
   {
      perror("Error al crear el socket");
   }
   else if (connect(fd, res->ai_addr, res->ai_addrlen))
   {
      perror("Error al conexionar con el servidor");
      close(fd);
      fd = -1;
   }
}

if (res)
{
   freeaddrinfo(res);
}

这样您就可以从主机名和端口获得sockaddr,而无需关心IPv4,IPv6等。