РЕДАКТИРОВАТЬ: Обнаружена новая проблема - я все еще не верю, что использование INADDR_ANY
в качестве адреса клиента хорошо, но на самом деле это не проблема здесь.
Вместо этого проблема в строке:
if (clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) < 0)
Обратите внимание, что <
имеет более высокий приоритет, чем =
, поэтому вы присваиваете логическое значение clientSocket
здесь.К аналогичной строке в коде сервера добавлена скобка, которая заставляет его работать правильно.
Рабочая строка в коде сервера:
if ((listeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
СТАРЫЙ ОТВЕТ: Я все еще поддерживаю это,но это не проблема здесь
.
Это ваша проблема прямо здесь (в клиенте):
server_addr.sin_addr.s_addr = INADDR_ANY; //Vi Client-Server chung 1 may
ПутьРабота сокетов заключается в том, что вы создаете серверный сокет, который прослушивает входящие соединения, а при создании вы сообщаете ему, от кого принимать соединения.Либо с определенного адреса, диапазона адресов, либо просто от кого-либо.Третий вариант является наиболее распространенным здесь, и тот, который вы выбрали на своем сервере (привязать к адресу INADDR_ANY).
Эта часть хороша.
Однако, когда клиент долженподключиться к серверу, вы не можете просто сказать: «подключиться к чему-либо!»и ожидайте, что он найдет ваш сервер (или вообще что-нибудь).Поэтому, когда вы пытаетесь соединиться с клиентским сокетом, вы должны дать ему фактический адрес сервера.
Я нашел пример того, как это сделать:
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// Convert IPv4 and IPv6 addresses from text to binary form
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0)
{
printf("\nInvalid address/ Address not supported \n");
return -1;
}
if (connect(sock, (struct sockaddr*) & serv_addr, sizeof(serv_addr)) < 0)
Изменить адресна правильный для вашего сервера, если localhost
(127.0.0.1
) не работает для вас.