Эти функции ожидают строку, а вы передаете им что-то еще.
Например:
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
, например ::1010 *
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 и т. Д.