Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2012, 02:04   #1
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию Ошибка в программе [Delphi 7] при передаче данных - "socket error"

Всем доброго времени суток. Написал программу, которая при подключение получает и отправляет некоторые данные, затем на основе этих данных делает запись в бд mysql.

Выдаются такие ошибки
- asynchronous socket error 10053
- Window socket error: удаленный хост принудительно разорвал существующее подключение 10054, on 'API' send
- [Mysql][ODBC 5.1 Driver][mysql 5.5.25a] server has gone away

При возникновении этих ошибок, программа перестаёт работать ... Как я понимаю, основная проблема - это первая ошибка. Программа не может работать с потоком пользователей ...
По поводу 2ой - вообще догадок нет, что это могло быть ...
3ая - Видимо соединение пропало с базой mysql

Код:
procedure TForm1.ServerSocket1ClientWrite(Sender: TObject;
  Socket: TCustomWinSocket);
var
a: String;
b: Integer;
begin
  b:=0;
  while b <5 Do
  begin
  a:=a+chr(random(26)+97);
  b:=b+1;
  end;
a:=Crypterus(a,'afnjuftar',false); 
Socket.SendText(a);
code:=Crypterus(a,'afnjuftar',true);
end;
Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var
  logpass:string;
  sql: string;
begin
  ADOQuery1.SQL.Clear;
  sql:='';
  logpass:=Socket.ReceiveText;
  SetLength(T, 10);
  Exploder(T, '^1^', logpass);
memo1.Lines.add(T[0]+' / '+T[1]+' / '+code+' / '+Socket.RemoteHost);
WriteToFile('logs1'+T[0]+'.txt',DateToStr(Date)+' : '+TimeToStr(Time)+' '+T[0]+' / '+T[1]+' / '+code+' / '+Socket.RemoteHost);
WriteToFile('logs2'+Socket.RemoteHost+'.txt',DateToStr(Date)+' : '+TimeToStr(Time)+' '+T[0]+' / '+T[1]+' / '+code+' / '+Socket.RemoteHost);

sql:='UPDATE accounts SET md5_code="'+MD5Print(MD5String(T[0]+T[1]))+'" WHERE t0 ="'+T[0]+'" AND md5_t1="'+MD5Print(MD5String(T[1]))+'"';

memo1.Lines.add(sql);

ADOQuery1.Active:=false;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(sql);
ADOQuery1.ExecSQL;
end;

Кто может помочь, сделать так, чтобы программа смогла работать с несколькими пользователями и перестала выдавать ошибку (asynchronous socket error 10053)

Последний раз редактировалось -Jack-; 17.07.2012 в 02:18.
-Jack- вне форума Ответить с цитированием
Старый 17.07.2012, 03:39   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Сообщение от http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
WSAECONNABORTED (10053) - Software caused connection abort.

An established connection was aborted by the software in your host computer, possibly due to a data transmission time-out or protocol error.
В следствии первой возникают и оставшиеся 2 ошибки.

Вы как-то не правильно данные отправляете, либо не правильно организовали работу программы с несколькими юзерами. Хотя 1 более вероятно т.к. рвется соединение при отправке данных а не при сообщении нескольких юзеров.

В любом случае, то что я сказал, это перевел цитированный сабж с MSDN на русский.

Берите сниффер(Wireshark в гугле находится.) в руки и шерстите отправку..
Человек_Борща вне форума Ответить с цитированием
Старый 17.07.2012, 03:46   #3
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Берите сниффер(Wireshark в гугле находится.) в руки и шерстите отправку..
Да в том то и дело, что когда 1 пользователь отправляет и принимает данные, то этих ошибок нету ...

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
либо не правильно организовали работу программы с несколькими юзерами.
в том то и дело - что я указал в первом посте это основная часть программы ... и никакой организации работы с несколькими пользователями нет ...

Последний раз редактировалось -Jack-; 17.07.2012 в 03:54.
-Jack- вне форума Ответить с цитированием
Старый 17.07.2012, 04:01   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Сообщение от -Jack- Посмотреть сообщение
в том то и дело - что я указал в первом посте это основная часть программы ... и никакой организации работы с несколькими пользователями нет ...
Думаю, проблема очевидна. Если вы решили использовать многопользовательский режим там, где его нет

Поищите исходники чатов на delphi, самых простых.. там будет многопользовательский во всей красе.
Человек_Борща вне форума Ответить с цитированием
Старый 18.07.2012, 05:13   #5
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

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


На нажатии на кнопку, при выполнении некоторых условий выполняется
активация сокета
Код:
clientsocket1.Active:=true;
и дальше вот такое

Код:
procedure TForm4.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
code:=Socket.ReceiveText();
CreateProcess(...);
В переменную code мы записываем текст, который пришёл с сервера. Далее, сразу же идёт команда для запуска процесса ( в параметрах запуска процесса находится эта переменная -code).

Вопрос такой, может ли программа не получив данные с сервера взять и запустить процесс ? Или будет выполняться последовательно: сначала получим данные, потом запустим процесс?
-Jack- вне форума Ответить с цитированием
Старый 18.07.2012, 05:46   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

код выполняется последовательно, но проблема в том что TCP это потоковый протокол, и вы можете получить таким методом больше или меньше данных чем надо(например часть строки или две склеенные строки)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.07.2012, 05:57   #7
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Вот почему мне пользователи мозг вскрывают, что у них ерунда приходит ... И что делать в этой ситуации ?

Последний раз редактировалось -Jack-; 18.07.2012 в 06:44.
-Jack- вне форума Ответить с цитированием
Старый 18.07.2012, 07:29   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Использовать ИНДИ или Синапс. Там проблема склейки протоколов решена. Или читать что-то типа:
http://delphiworld.narod.ru/base/soc...ne_blocks.html
http://delphiworld.narod.ru/base/get_packages.html
http://delphiworld.narod.ru/base/long_data_blocks2.html
http://delphiworld.narod.ru/base/long_data_blocks.html
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в TCPClient1 -> Socket Error # 10060 k_root Работа с сетью в Delphi 4 30.01.2012 20:08
Ошибка при передаче по ссылке N-Cat Помощь студентам 4 10.05.2011 01:24
Ошибка в передаче данных Krasi PHP 3 01.05.2011 17:15
Ошибка Socket Error # 10061 Connection Refused !!! $T@LKER Работа с сетью в Delphi 0 06.09.2010 21:28
Ошибка сетевого приложения Asynchronous socket error 10060 Glorius Свободное общение 7 22.03.2009 12:19