Я пишу клиента, где я должен связать клиентский сокет.Это отлично работает.После этого я пытаюсь подключить сокет и получаю ошибку 10048. (Адрес уже используется.) Я не понимаю, как это возможно.
Я должен реализовать клиент, говорящий с несколькими серверами.Каждый сервер принимает сообщения только от определенного порта.(каждый сервер ожидает свой порт).поэтому я должен связать свой клиентский сокет.Код выше для создания одного из этих сокетов.Мой код работает несколько раз.Но очень часто подключение дает мне ошибку 10048, в то время как привязка раньше была в порядке.Я знаю, что bind может также выдавать ошибку 10048, если сокет уже используется.Но это не так.Возвращает 0. Итак, я думаю, порт свободен.Сразу после привязки я вызываю connect и получаю ошибку 10048. Не понимаю почему?В момент привязки порт был явно свободен.
bool TEthernetSocket::Open()
{
WSADATA wsaData;
if (WSAStartup((MAKEWORD(2, 0)), &wsaData) == SOCKET_ERROR)
{
return IsConnected();
}
Socket = socket(AF_INET, SOCK_STREAM, 0); // TCP
if (Socket == INVALID_SOCKET)
{
return false;
}
//bind Socket
struct sockaddr_in sa_loc;
memset(&sa_loc, 0, sizeof(struct sockaddr_in));
sa_loc.sin_family = AF_INET;
sa_loc.sin_port = htons(ClientPort);
sa_loc.sin_addr.s_addr = inet_addr(IPClient.substr(0, 15).c_str());
CALL_TRACE_CB("ethernetSocket connected");
if (!(bind(Socket, (struct sockaddr*)&sa_loc, sizeof(struct
sockaddr))))
{
CALL_TRACE_CB("Bind works");
}
else
{
AnsiString msg = AnsiString().sprintf("EN: error socket Bind:
%d", WSAGetLastError());
CALL_ERROR_CB(ERROR_NO_PORT_HANDLE, msg.c_str());
Close();
}
// TCP
SOCKADDR_IN sAdd;
sAdd.sin_family = AF_INET;
sAdd.sin_port = htons(Port);
sAdd.sin_addr.s_addr = inet_addr(IP.substr(0, 15).c_str());
if (connect(Socket, (SOCKADDR*)&sAdd, sizeof(SOCKADDR_IN)) ==
SOCKET_ERROR)
{
AnsiString msg = AnsiString().sprintf("EN: error connect
errorcode: %d", WSAGetLastError());
}
}
Я ожидаю, что bind () вернет 10048, прежде чем connect вернет эту ошибку, но фактическое только connect () вернет эту ошибку