我正在使用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;
}
答案 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等。