C builder socket error

Server Socket, Asynchronous socket error 10053 C++ Builder Решение и ответ на вопрос 1224348

Zerorc

1 / 1 / 1

Регистрация: 14.03.2014

Сообщений: 46

1

08.07.2014, 11:50. Показов 8056. Ответов 18

Метки нет (Все метки)


Всем привет. Сразу к делу. Работаю с компонентом ServerSocket, при приеме данных возникает asynchronous socket error 10053.
Сервер работает в режиме stNonBlocking, клиент — постоянно посылает какую-то информацию. Задача — принять и обработать. Интервал между посылками, примерно 20ms а размер пакета 150 байт.

C++
1
2
std::vector <unsigned char> dataAll; //приемный контейнер
BYTE buf[2000];                 //переменный буфер
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
        length = ServerSocket1->Socket->Connections[0]->ReceiveLength();
        ServerSocket1->Socket->Connections[0]->ReceiveBuf(buf, length);
        dataAll.resize(dataAll.size() + length);
        memcpy(&dataAll[dataAll.size() - length], &buf, length);
        lengthAll+=length; Form1->Edit2->Text = lengthAll;

Принимаю в контейнер, таким вот способом, по событию чтения клиента. Так вот, открываю порт, слушаю, жду connect’a, пока все в порядке. Но как только клиент подключается, он сразу же начинает забрасывать потоком данных и не успев принять, возникает error 10053.
Какие есть варианты? Быть может прописать что-то в OnClientError, помимо ErrorCode = 0.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

08.07.2014, 11:50

18

733 / 524 / 129

Регистрация: 31.05.2013

Сообщений: 2,922

Записей в блоге: 3

08.07.2014, 14:29

2

Скорее всего не хватает выделенной памяти на прием в Вашем «контейнере»



0



Zerorc

1 / 1 / 1

Регистрация: 14.03.2014

Сообщений: 46

08.07.2014, 17:41

 [ТС]

3

Так Вектор в том-то и дело что сам наращивается и ему все равно какой длинны он будет, пока не займет в теории всю оперативную память компьютера.
Другое дело что массив в векторе в памяти идет как бы подряд и если какой-то участок памяти на его доблестном разрастании занят, то он переносит весь вектор в новый участок плюс резервирует место, при каждом наращивании все больше и больше.
Проблема в том что как только клиент присоединяется, моментально вылетает ошибка или вовсе программа убивается виндой. Не понимаю почему так.

Добавлено через 2 часа 21 минуту
Попробовал стандартный чатик из Examples в builder. Все великолепно принимает, простой как палка.

C++
1
2
3
4
5
void __fastcall TChatForm::ServerSocketClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo2->Lines->Add(Socket->ReceiveText());  
}

Опять же проблема значится в алгоритме записи моем. У кого есть какие идеи как записать, если не с помощью вектора. В принципе, мне ведь все равно, идут данные подряд в памяти или нет. Можно использовать и контейнеры с указателем на следующую ячейку. Может повозиться с динамическим буфером, второй побольше создать, туда перенести, как заполнен первый а потом удалить его. Есть-какие предложения?
Или использовать ReceiveText, загонять в string, а после уже разбивать как захочу?
Но разве это из-за ReceiveBuf() запара? Или все-таки с вектором перемудрил?



0



Dinkin

733 / 524 / 129

Регистрация: 31.05.2013

Сообщений: 2,922

Записей в блоге: 3

08.07.2014, 18:13

4

можно попробовать так

C
1
2
3
int len = ServerSocket1->Socket->ReceiveLength();
char* buf= new char[len+1];
ServerSocket1->Socket->ReceiveBuf((void*)buf, len);



1



91 / 91 / 22

Регистрация: 02.07.2013

Сообщений: 332

09.07.2014, 10:21

5

Dinkin, прежде, чем ковыряться в коде, имеет смысл ознакомиться с самой ошибкой. 10053 означает «удалённый компьютер закрыл подключение». Из-за чего-то. Т.е., при попытке доступа к сокету, соединение уже разорвано. Думаю, надо смотреть клиента…



0



733 / 524 / 129

Регистрация: 31.05.2013

Сообщений: 2,922

Записей в блоге: 3

09.07.2014, 11:46

6

Цитата
Сообщение от c0rvax
Посмотреть сообщение

смысл ознакомиться с самой ошибкой. 10053 оз

Так он же пишет, что при нормальной отправке данных все норм…а данная ошибка в основном распространяется на сервер, который закрывает соединение, если что-то не успел/не смог обработать по какой-либо причине.



0



c0rvax

91 / 91 / 22

Регистрация: 02.07.2013

Сообщений: 332

09.07.2014, 12:03

7

Dinkin, можешь, конечно, остаться при своих. А можешь показать код, как происходит отправка. Или хотя бы сделай предварительную проверку, активно ли подключение

C++
1
2
3
4
if( ServerSocket1->Socket->Connections[0]->Connected )
{
  ...
}



0



733 / 524 / 129

Регистрация: 31.05.2013

Сообщений: 2,922

Записей в блоге: 3

09.07.2014, 13:05

8

так я то че, не мне же помогать,с меня за чем код?) а парень свой код выше показал, при каких случаях у него ошибка



0



Zerorc

1 / 1 / 1

Регистрация: 14.03.2014

Сообщений: 46

10.07.2014, 11:03

 [ТС]

9

Клиент, это плата, подсоединенная к чипу Withnet Ethernet W5100, она просто кидает connect и если сервер отвечает, начинает забрасывать данные. Дело в том что другая прога, которую я писал на Delphi, работает, хотя в builder’e сделал все аналогично, за исключением вектора. Там был статический буфер, набиваемый до конца, а после закрывающий соединение. И еще, как я понял Indy server работает в Thread blocking а Server socket в nonBlocking.
Теперь же задача стоит в том, что мы не знаем сколько будет данных, поэтому и вектор. Плата шлет огромное количество попыток connect() и как только получает ответ, начинает кидать данные.

C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
        mLog->SelAttributes->Color = clBlue;
        mLog->Lines->Add("[" + TimeToStr(Time()) + "] подключен: " + ServerSocket1->Socket->Connections[0]->RemoteAddress);
        Edit1->Text = Form1->ServerSocket1->Socket->Connections[0]->RemoteAddress;
 
}

Особенность только в работе с платой, но дело ведь в том что на другой проге все ок, а с этими сокетами ошибки лезут вот такие.

Добавлено через 5 минут
И я тут подумал, если попыток connect’а много, пока сеть обнаружится, все дела, ведь до подачи питания на плату, сети-то и нет. Так вот, приходит сразу 10 коннектов, у меня не предусмотрена работа с несколькими соединениями. Сервер видит их как много клиентов и открывает столько потоков, сколько пришло connect(). А после и ложится, ибо я работаю только с Connections[0]. Больше не предусмотрел, все равно клиент всегда один.
В ThreadBlocking все идет одним потоком и ему до лампочки сколько connect() он получил. Начал, отработал и дисконнектнул клиента.



0



91 / 91 / 22

Регистрация: 02.07.2013

Сообщений: 332

10.07.2014, 12:24

10

Zerorc, ну, какие мысли. Во-первых, «буфер, набиваемый до конца, а после закрывающий соединение» — это уже неправильно. Соединение не следует закрывать, пока программа работает. Общая логика такова: открыли один раз соединение, набиваем буфер, набили отправили, очистили буфер, снова набиваем. И ничего не закрываем, соединение всегда установлено. Практика показывает, что команда на закрытие соединения может придти гораздо быстрее, чем отправляемый буфер данных. И в тот момент, когда сервер начинает что-то пытаться читать из сокета, последний уже закрыт, а то и NULL. Отсюда и ошибка 10053 возникает «удалённый компьютер закрыл подключение».

Во-вторых, совершенно правильная мысль, что неверно обращаться к Connections[0]. Для того, чтобы серверу однозначно правильно что-то читать из сокетов, надо использовать передаваемый в событие OnClientRead параметр Socket, ибо это именно он готов отдать какие-то данные. А самих активных подключений [ServerSocket->ActiveConnections] может быть великое множество.



1



Zerorc

1 / 1 / 1

Регистрация: 14.03.2014

Сообщений: 46

10.07.2014, 12:37

 [ТС]

11

Дело в том что так было в прошлой программе и все работало, теперь я не закрываю соединение, к тому же там буфер был действительно огромный и мог принять большой обьем информации. Знаю, что лучше в файл, потом очищать буфер, дописывать в файлик и тд.

Переделал код таким вот образом

C++
1
 int concnt = -1; //счетчик действующих клиентов. Глобально
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
         concnt++;
        mLog->SelAttributes->Color = clBlue;
        mLog->Lines->Add("[" + TimeToStr(Time()) + "] подключен: " + ServerSocket1->Socket->Connections[concnt]->RemoteAddress);
        Edit1->Text = Form1->ServerSocket1->Socket->Connections[concnt]->RemoteAddress;
}
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
        mLog->SelAttributes->Color = clGray;
        mLog->Lines->Add("[" + TimeToStr(Time()) + "] отключен: " + ServerSocket1->Socket->Connections[concnt]->RemoteAddress);
        GraphTimer->Enabled = false;
        concnt--;
}
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
        unsigned len = ServerSocket1->Socket->Connections[concnt]->ReceiveLength();
        BYTE* buf= new BYTE[len+1];
        ServerSocket1->Socket->Connections[concnt]->ReceiveBuf((char*)buf, len);
dataAll.resize(dataAll.size() + len);
        memcpy(&dataAll[dataAll.size() - len], buf, len);
        lenAll+=len; Form1->Edit2->Text = lenAll;
 
        delete buf;

что происходит. Пишет что клиент подключен, может и раз десять так написать, подряд и принимает какими-то промежутками данные. Все равно не то что нужно. Соединение не закрываю вообще.



0



c0rvax

91 / 91 / 22

Регистрация: 02.07.2013

Сообщений: 332

10.07.2014, 12:58

12

Лучший ответ Сообщение было отмечено Zerorc как решение

Решение

Я говорил про это

C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
        unsigned len = Socket->ReceiveLength(); // сокет, который из параметров !!!
        BYTE* buf= new BYTE[len+1];
        Socket->ReceiveBuf((char*)buf, len);
dataAll.resize(dataAll.size() + len);
        memcpy(&dataAll[dataAll.size() - len], buf, len);
        lenAll+=len; Form1->Edit2->Text = lenAll;
 
        delete buf;



1



Zerorc

1 / 1 / 1

Регистрация: 14.03.2014

Сообщений: 46

10.07.2014, 13:49

 [ТС]

13

Опа! А вот тут я не понял. Я беру получается, обращаясь к определенному соединению, которое, быть может, было когда-то но в данный момент его нет. И из-за этого ошибка 10053.

Но, когда я обращаюсь к активному соединению, посредством

C++
1
unsigned len = Socket->ReceiveLength(); // сокет, который из параметров !!!

то данные я гарантированно получу. Так?

C++
1
2
3
4
5
6
7
8
        unsigned len = Socket->ReceiveLength();
        BYTE* buf= new BYTE[len+1];
        Socket->ReceiveBuf((char*)buf, len);
        dataAll.resize(dataAll.size() + len);
        memcpy(&dataAll[dataAll.size() - len], buf, len);
        lenAll+=len; Form1->Edit2->Text = lenAll;
 
        delete buf;



0



91 / 91 / 22

Регистрация: 02.07.2013

Сообщений: 332

10.07.2014, 14:36

14

Connections[] — это все активные соединения сервера. Их может быть несколько, что понятно. На то он и сервер. Допустим их 10. И тут один из клиентов, скажем 5-й, присылает данные. Читать надо данные именно из этого сокета, а не из какого-то определённого. Для этого на него и передаётся в событийную функцию ссылка.



0



1 / 1 / 1

Регистрация: 14.03.2014

Сообщений: 46

10.07.2014, 14:41

 [ТС]

15

Ага, все понятно. Я читал всегда с 0 соединения что в принципе было правильно, ибо клиент один и доколе соблюдение протокола оказывалось филигранным, так сказать, касаемо двух ПК, к примеру.
Но самопальная программа, которая посылает коннект пару сотен раз и может оказаться на любом Connections[?] имела все это ввиду.
И если я читаю

данные именно из этого сокета, а не из какого-то определённого

, то все в порядке)



0



91 / 91 / 22

Регистрация: 02.07.2013

Сообщений: 332

10.07.2014, 15:09

16

С 0 соединения можно читать, если клиент однозначно один и он регулярно не закрывает подключение. Допустим клиент отправил данные и закрыл подключение, а потом подключился ещё раз, чтобы ещё раз отправить. Так как всё это дело выполняется в некоем потоке, то вполне возможен вариант, что «старый», неиспользуемый уже сокет ещё не удалён из Connections[], ActiveConnections будет равен 2 и очередную порцию данных надо будет читать из Connections[1].



0



Zerorc

1 / 1 / 1

Регистрация: 14.03.2014

Сообщений: 46

10.07.2014, 15:15

 [ТС]

17

Тогда правильный ли вариант с отправкой этому клиенту сообщения, если он регулярно может сбросить соединение, к примеру, после снова подключиться. Если я все правильно понял..

C++
1
2
3
4
5
void __fastcall TForm1::Button3Click(TObject *Sender)
{
... //проверки есть ли соединение, во избежание вылетов
Form1->ServerSocket1->Socket->Connections[ServerSocket1->Socket->ActiveConnections-1]->SendBuf(buff,100);
}

Я не могу считать событие ибо событие у меня здесь — это нажатие кнопочки. Единственный выход?



0



c0rvax

91 / 91 / 22

Регистрация: 02.07.2013

Сообщений: 332

10.07.2014, 15:36

18

Я бы не так сделал. Во-первых, нет никакой гарантии, что активным является именно последний сокет из всех имеющихся. К тому же, придерживаюсь идеологии, что если сервер что-то отправляет, то надо отправлять всем клиентам. Раз все клиенты подключаются к одному серверу, то каждому надо как-то получать результаты работы других. Тот же чат, например. Один сказал, а всем пришло. Во-вторых, совершенно верно, необходимо убедиться, что подключение активно. Поэтому, чтобы убить всех зайцев, я бы посоветовал такую реализацию

C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  for( int i = 0; i < ServerSocket1->Socket->ActiveConnections; i++ )
  {
    TCustomWinSocket* ASocket = ServerSocket1->Socket->Connections[ i ];
    if( ASocket && ASocket->Connected )
    {
      ASocket->SendBuf( buff, 100 );
    }
  }
}



1



1 / 1 / 1

Регистрация: 14.03.2014

Сообщений: 46

10.07.2014, 15:51

 [ТС]

19

Неплохо. Но это тогда выйдет широковещательная посылка. А если, я, к примеру, даю модулю команду отключиться. В принципе, если известен IP, его можно вытащить и по нему выбрать соединение, сравнением, пройтись по всем и отправить нужному.
Но это уже темка для отдельной статьи. С асинхроном разобрался. Спасибо за помощь.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

10.07.2014, 15:51

19

Содержание

  1. C builder socket error
  2. C builder socket error
  3. C builder socket error
  4. C builder socket error

C builder socket error

c++ builder 5 ошибка asynchronous socket error 10049!
ошыбка в клиенте
//—————————————————————————

#include
#pragma hdrstop

Добавлено 26.03.08, 20:03
а кстате забыл что хочу чтоб опредилить серв онлайн или офлайн!

#define WSAEADDRNOTAVAIL 10049L
а ету строку вставлять?

с етой строкой серовео выскакивает ошыбка!

Добавлено 27.03.08, 07:58
сори я еще не совсем разбираюсь на c++ builder

Это расшифровка ошибки.

Чтобы уметь читать, не обязательно вообще знать о существовании Borland C++ Builder.

ок токшо разабрался что нада вставить

вставить надо было строку:
ErrorCode = 0;

терь ошбка на строке:
ClientSocket1->Port = Edit2->Text;

код:
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
<
if(Key == VK_RETURN)
<
ClientSocket1->Active = false;
ClientSocket1->Address = Edit1->Text;
ClientSocket1->Port = Edit2->Text;
ClientSocket1->Active = true;
>
>

ошыбка:
[C++ Error] Unit1.cpp(45): E2034 Cannot convert ‘AnsiString’ to ‘int’

мне от интересно, если человек пишет ошЫбка, не в ДНК ли проблема.

по поводу
Cannot convert ‘AnsiString’ to ‘int’

Для тех кто в танке
переменной с типом int (ClientSocket1->Port) нельзя присваивать текстовое значение (Edit2->Text)
по-моему кому-то читать и читать книжки.

Источник

C builder socket error

Имеется следующая проблема:
Программа написана на C++ Builder 6, суть в том, что программа при помощи компонентов ClientSocket отправляет запрос на сервер и получает ответ. Если я работаю непосредственно в Builder 6 и нажимаю «RUN» — всё работает отлично. Однако как только я пытаюсь запустить программу вне Builder , в момент задействования компонента ClientSocket выдаются следующие ошибки:
Windows Socket error: Этот хост неизвестен (11001), on API ‘Asyng Lookup’

И вторая ошибка Asynchronous socket error 10061

Может кто-то знает что делать в данной ситуации?

10061 — Connection refused. No connection could be made because the target computer actively refused it. This usually results from trying to connect to a service that is inactive on the foreign host—that is, one with no server application running.
Сервер то в этот момент работает ?

11001 — Host not found.
No such host is known. The name is not an official host name or alias, or it cannot be found in the database(s) being queried. This error may also be returned for protocol and service queries, and means that the specified name could not be found in the relevant database.

Источник

C builder socket error

Тоесть предлагаете написать код со следующией логикой:
На сервере:
1. Если происходит событие onDisconect, то убираем из списка клиентов, того клиента кто вызвал это событие
2. Если происходит ошибка 10053, то тоже убирать из списка.

А ведь всед за 10053, через некоторый промежуток времени происходит ошибка 10054 (Удаленый хост принудительно разоравал соединение).

Да дело то не в том, что б отловить ошибку и погасить её (ErrorCode=0), а в том, что я хочу понять почему один и тот же код вызываемый в разных местах программы, в разные промежутки времени, в одном случаие на сервере проходит корректно, а в другом случаие вызывает ексепшн.

Может дело из-за того, что у меня во второй раз метод Close() вызывается из класса который вертится в отдельном потоке?
Но я пробовавал следующее: я создал метод класса Disc(), который вызвает метод Close() сокета, и вызывал Disc() с того места где все проходит нормально, и ошибок не возникало !

В чем проблема то?

WSAECONNABORTED (10053) Software caused connection abort.
Berkeley description: A connection abort was caused internal to your host machine. The software caused a connection abort because there is no space on the socket’s queue and the socket cannot receive further connections.
WinSock description: Partly the same as Berkeley. The error can occur when the local network system aborts a connection. This would occur if WinSock aborts an established connection after data retransmission fails (receiver never acknowledges data sent on a datastream socket).
TCP/IP scenario: A connection will timeout if the local system doesn’t receive an (ACK)nowledgement for data sent. It would also timeout if a (FIN)ish TCP packet is not ACK’d (and even if the FIN is ACK’d, it will eventually timeout if a FIN is not returned).
User suggestions: There are a number of things to check, that might help to identify why the failure occurred. Basically, you want to identify where the problem occurred.
· Ping the remote host you were connected to. If it doesn’t respond, it might be off-line or there may be a network problem along the way. If it does respond, then this problem might have been a transient one (so you can reconnect now), or the server application you were connected to might have terminated (so you might not be able to connect again).
· Ping a local host to verify that your local network is still functioning (if on a serial connection, see next step)
· Ping your local router address. If you’re on a serial connection, your local router is the IP address of the host you initially logged onto with SLIP or PPP.
· Ping a host on the same subnet as the host you were connected to (if you know one). This will verify that the destination network is functioning.
· Try a «traceroute» to the host you were connected to. This won’t reveal too much unless you know the router addresses at the remote end, but it might help to identify if the problem is somewhere along the way.

WSAECONNRESET (10054) Connection reset by peer.
Berkeley description: A connection was forcibly closed by a peer. This normally results from a loss of the connection on the remote socket due to a timeout or a reboot.
WinSock description: Same as Berkeley. On a datastream socket, the connection was reset. This reset could be generated locally by the network system when it detects a connection failure, or it might be received from the remote host (in TCP terms, the remote host sent a RST packet). This error is also possible on a datagram socket; for instance, this error could result if your application sends a UDP datagram to a host, which rejects it by responding with an ICMP Port Unreachable.
User suggestions: Some network systems have commands to report statistics. In this case, it might be possible to check the count of TCP RST packets received, or ICMP Port Unreachable packets. See other suggestions under WSAECONNABORTED.

Поборол таки.
Вообщем дело было так:
После того, как сервер отправляет команду на отключение, он еще (за спиной) посылает три пакета, а так как я по получении команды отключиться, в клиенте сразу отключался, естесвенно сервер не мог эти три пакета доставить. Вот и байда.

Спасибо Oleg2004, навел на нужные мысли.

Источник

C builder socket error

А ты порт указал одинаковый?
Или по-умолчанию 0 оставил?
Поставь какой-нибудь 10000.

Сразу совет.
Но по моему опыту иногда сообщение не приходит целиком, бывает если послать сразу несколько, то частично они приходят вместе. Поэтому я передаю в кронце сообщения спецсимвол, который не применяю в сообщениях (ты можешь использовать слово).

Т.е. у меня разделителем является |.
Соответсвтенно мы выделяем из принятой информации переданные данные храня частично принятую информацию и если сразу много строк принято, обрабатываем по-очереди.

Да, поставь обработчик ошибок на сокет.

и ошибка исчезла
Или его можно не включать.
И вообще обьясните мне, если есть компоненты ТСерверСокет и ТКлиентСокет, зачем тогда использовать просто Socket? Или наооборот, если использовать Socket тогда зачем кидать на форму компоненты.

И еще такой вопрос. Может ли быть пользователь одновременно и клиентом и сервером?Возможнол на разных портах? Или можна ли создать несолкьо клиентов (имею ввиду компонентов ТКлиентСокет) или серверов на разных портах на одном компе? Если да то как с ними работать? Ведь Socket->ReceiveText() работает вообще не понятно как?

И вообще обьясните мне, если есть компоненты ТСерверСокет и ТКлиентСокет, зачем тогда использовать просто Socket?
Ты не компонент в данном случае используешь, а ссылку на эелмент массива сокетов сервера.

Можно несколько серверов на одном компе (но на разных портах) и клиентов на одном компе.
А сокетов у сервера будет по числу клиентов, поэтому у него и массив сокетов. Но при OnSocketClienRead ссылка на сокет ссылается на соответствующий элемент массива сокетов, поэтому ты просто Socket->ReceiveText(); делаешь.

Соответственно чтобы различать клиентов, которые могут быть с одного IP, нужно использовать хендл. Он у всех разный.
Я просто потер этот код посчитав лишним. Вот в начале

Вот так я храню клиента.
Т.е.

Ну у меня такая система. Т.е. при старте клиентской программы не известно кто присоединится конкретно, поэтому заносится в oIP адрес машины, а в имя знак ?.
Потом когда конкретный пользователь залогилися, присылается команда Logon

Где ParameterMessage вырезается из Message (описано выше).

Источник

When programming communications using TClientSocket and TServerSocket in C++Builder, clients that use TClientSocket use TClientSocket-> The server using the TServerSocket side will sometimes report the error “” Asynchronous Socket Error 10053″ when the close disconnects and exits the program. Reference to the error instruction: Software caused Connection abort. This is a tricky one because you still can’t be sure where the problem is.
In fact, this error is largely the result of the TClientSocket dropping to Free without a client/server disconnect. There are two solutions here.
A: In the calling TClientSocket TClientSocket before the Close of the call. The Socket. The Close connection is broken, but it also has another problem, there is also did not receive complete data, the server at this time will still be submitted to the Asynchronous Socket error 10053 error, So the call TClientSocket. Socket. Can call again before the Close TClientSocket. Socket. ReceiveText will server sends the data to receive completely
Add the following code to the OnClientError event on the server:

if(ErrorCode==10053)
   Socket->Close;
ErrorCode= 0;

Disconnect the connection and set the ErrorCode to 0. If you don’t, the error code is still 10053 even though the connection is disconnected, you’ll still pop up to report Asynchronous Socket Error 10053.
Original: https://blog.csdn.net/shuiyuanfengxing/article/details/8504139

Read More:

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    [!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь

    >
    вопросы по серверным сокетам
    , не работает после компиляции

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    10.12.07, 07:11

      Имеется следующая проблема:
      Программа написана на C++ Builder 6, суть в том, что программа при помощи компонентов ClientSocket отправляет запрос на сервер и получает ответ. Если я работаю непосредственно в Builder 6 и нажимаю «RUN» — всё работает отлично. Однако как только я пытаюсь запустить программу вне Builder , в момент задействования компонента ClientSocket выдаются следующие ошибки:
      Windows Socket error: Этот хост неизвестен (11001), on API ‘Asyng Lookup’

      И вторая ошибка Asynchronous socket error 10061

      Может кто-то знает что делать в данной ситуации?


      popsa



      Сообщ.
      #2

      ,
      10.12.07, 07:33

        10061 — Connection refused. No connection could be made because the target computer actively refused it. This usually results from trying to connect to a service that is inactive on the foreign host—that is, one with no server application running.
        Сервер то в этот момент работает ?

        11001 — Host not found.
        No such host is known. The name is not an official host name or alias, or it cannot be found in the database(s) being queried. This error may also be returned for protocol and service queries, and means that the specified name could not be found in the relevant database.

        выкладывай код …


        DrMort



        Сообщ.
        #3

        ,
        10.12.07, 07:47

          Full Member

          ***

          Рейтинг (т): 7

          Полюбому код нужен. Причём как клиентской части, так и серверной. По крайней мере должны совпадать порты и режимы сокета. Хост к которому пытается подцепиться клиент указан ИП адресом? Всё указывает на то что ты пытаешься либо заюзать уже использующийся каким то приложением порт, либо вписываешь протокол которого не существует, либо ещё что то в этом роде.


          M.A.G.



          Сообщ.
          #4

          ,
          10.12.07, 08:03

            Хост к которому конектится сокет указан УРЛ адресом: site.ru
            Если я указываю хост IP адресом,всё работает нормально.
            Но как сделать что бы работал и с УРЛ?

            Добавлено 10.12.07, 08:04
            код тривиален:

            ExpandedWrap disabled

              ClientSocket1->Port = 80;

              ClientSocket1->Host = «site.ru»;

              ClientSocket1->ClientType = ctNonBlocking;

              ClientSocket1->Open();


            Oleg2004



            Сообщ.
            #5

            ,
            10.12.07, 09:19

              Цитата M.A.G. @ 10.12.07, 08:03

              Но как сделать что бы работал и с УРЛ?

              Цитата

              Функция gethostbyname() принимает в качестве единственного параметра доменное имя Интернет-хоста и возвращает указатель на структуру hostent:
              struct hostent *gethostbyname(const char *host_name);
              например – gethostbyname(«www.microsoft.com»).

              Структура hostent состоит из следующих компонентов:

              ExpandedWrap disabled

                struct hostent

                {

                   char *h_name;        /* Официальное имя хоста.*/

                   char **h_aliases;    /* Массив псевдонимов данного хоста, заканчивающийся нулем */

                   int  h_addrtype;     /* Тип возвращенного функцией адреса; для Интернет это AF_INET */

                   int  h_length;       /* Длина адреса в байтах. Для типа AF_INET длина всегда 4

                 байта */

                   char **h_addr_list;  /* Указатель на массив указателей IPv4 адресов хоста. Он заканчивается нулем, порядок  следования байтов сетевой. */

                #define h_addr h_addr_list[0]/*Определяет h_addr как самый первый адрес хоста в списке*/};


              DrMort



              Сообщ.
              #6

              ,
              10.12.07, 09:52

                Full Member

                ***

                Рейтинг (т): 7

                Ну собсно всё уже ясно :)

                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                0 пользователей:

                • Предыдущая тема
                • Borland C++ Builder/Turbo C++ Explorer
                • Следующая тема

                Рейтинг@Mail.ru

                [ Script execution time: 0,0382 ]   [ 16 queries used ]   [ Generated: 9.02.23, 08:01 GMT ]  

                I am trying to send email using Indy 10.5.7 on C++ Builder XE but I get Host not found error. I added TIdSMTP, TIdSSLIOHandlerSocketOpenSSL and TIdMessage components. I set the host to smtp.office365.com, the port to 587 and UseTLS to utUseExplicitTLS. The username and password are set for the email address of the account I need to connect with.

                I am trying to send the email using :

                IdMessage1->From->Name = Name->Text;
                IdMessage1->From->Address = EmailAddress->Text;
                IdMessage1->Body = Msg->Lines;
                
                try
                {
                    IdSMTP1->Connect(1000);
                    try
                    {
                        IdSMTP1->Send(IdMessage1);
                    }
                    __finally
                    {
                        IdSMTP1->Disconnect();
                    }
                }
                catch (const Exception &E)
                {
                    MessageBox(NULL, E.Message.c_str(), L"Error", MB_OK | MB_ICONERROR);
                }
                

                asked Oct 15, 2019 at 5:15

                user6604390's user avatar

                6

                This line is wrong:

                IdSMTP1->Connect(1000);
                

                In Indy 9, Connect() had an overload that accepted a timeout as input. But in Indy 10, that overload was removed, and the timeout parameter was reimplemented as a ConnectTimeout property.

                Your original code compiles because Connect() in Indy 10 has an overload that takes a hostname String as input, overwriting the Host property, and (Ansi|Unicode)String has a constructor that accepts an int as input. Thus, your code is effectively doing this

                IdSMTP1->Connect(String(1000));
                

                Which tries to connect to a hostname named "1000", ignoring the "smtp.office365.com" hostname you assigned to the Host property. That is why you are getting socket error 11001.

                You need to replace the offending line with this code instead:

                //IdSMTP1->Connect(1000);
                IdSMTP1->ConnectTimeout = 1000;
                IdSMTP1->Connect();
                

                answered Oct 19, 2019 at 3:46

                Remy Lebeau's user avatar

                Remy LebeauRemy Lebeau

                536k30 gold badges444 silver badges750 bronze badges

                При коммуникации с TCLIENTIVESOCKES и TSERVERSOCKS в C ++ Builder, при использовании TCLIENTIVESOCKET-> CLEAND Отключите и выходит из клиента, используя TCLIENTIVESOCESTOCKET-> BLACK, используя TClicentsocket, с помощью TCEVERSOCKET, с использованием Tserversynous Socket Error 10053 ‘Эта ошибка, отзывы об этой ошибке: программное обеспечение. Вызвало соединение прервать. (Соединение прекращается из-за причины). По этой причине показано, что у вас есть куриное ребро, потому что вы все еще не можете определить, какое место имеет проблемы.

                На самом деле, эта ошибка имеет большую причину, в том, что между клиентом и сервером нет соединения без отключения, и здесь есть два решения (это своего рода способ, только решение отличается. Он будет отключен.)

                I: вызовите TClose, чтобы отключить перед вызовом TCliCentsocket, но есть еще одна проблема, то есть есть все еще нет полных данных, в какой момент сервер все еще будет сообщать об ошибке асинхронной сокеты 10053. Так что вызов tclienticate.socket.socket.receiveText получает Данные, отправленные TCLIENTICTOCKES.Socket.receiveText перед вызовом TClose .so

                Во-вторых: добавьте следующий код в событие OnClientError на сервере:

                if(ErrorCode==10053)
                   Socket->Close;
                ErrorCode= 0;
                
                

                Соединение отключено, и ErrorCode равно 0, если не установлено, хотя соединение отключено, но код ошибки по-прежнему 10053, и все еще появится окно отчета о асинхронной сокете 10053.

                Оригинал:https://blog.csdn.net/shuiyuanfengxing/article/details/8504139

                Понравилась статья? Поделить с друзьями:
              • C builder error detected lme200
              • C 4521 ошибка коника
              • C 32 11 ошибка камера сони
              • C 3102 ошибка konica minolta
              • C 1221 ошибка опель