Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

WinSocket. Ошибка при обработке FD_Read

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> WinSocket. Ошибка при обработке FD_Read
Имя
Сообщение << Старые топики   Новые топики >>
WinSocket. Ошибка при обработке FD_Read - 2007-04-12 23:08:40.700000   
Oburec

Сообщений: 18
Оценки: 0
Присоединился: 2006-12-09 20:19:25.436666
Уважаемые граждане!
Может кто поможет справиться со следующей проблемой.
Пишу простенький клиент сервер на WinSocket2. Для отслеживания событий происходящих с сокетом использую
WSAAsyncSelect. При выходе из процедуры реагирующей на FD_Read происходит acces violation. При этом читаются данные как-то по дурацки. Если просто вывожу считанную строку str, в которую я посылаю"123", то ShowMessage мне
выводит название того окна в которое шлется виндовс мессадж - Project1 (те окошко моего приложения).Если я приписываю к строке еще несколько символов, тогда сообщение выводится корректно. Впрочем финал при выходе из процедуры всегда одинаков - acces violation.Если закоментить recv ошибка пропадает.
В чем может быть проблемма?

// Создание прослушивающего сокета [b]procedure TForm1.ListenButtonClick(Sender: TObject);[/b] var addr :TSockAddrIn; Sockfd :TSocket ;//биндуемый и прослушиваемый сокет SockAccepted:TSocket;//сокет с установленным соединением i :integer ; ErrorCode :integer ; begin sockfd:=socket(AF_INET, SOCK_STREAM, 0); addr.sin_family:=AF_INET; addr.sin_port:=htons(StrToInt(Edit1.text)); addr.sin_addr.S_addr:=INADDR_ANY;//Автозаполнение своим ip FillChar(addr.sin_zero,8,0); ErrorCode:=Bind(sockfd,@addr,sizeof(addr)); if ErrorCode&lt;&gt;0 then begin case ErrorCode of ... end; exit; end; WSAAsyncSelect (sockfd,Form1.Handle,UM_DataAccept,FD_Accept); // Устанавливается прослушивание соединения с клиентом if Listen(sockfd,20)&lt;&gt;0 then ShowMessage('Error'); end; // Отслеживание присоединения клиента [b]Procedure TForm1.OnAcceptSocket(var msg:TMessage);[/b] var i:integer; SockFd,SockAccepted:TSocket; addr:TSockAddrIn; RcvBuf:byte; len,ErrorCode:integer; begin //showMessage('Accept'); i:=sizeof(addr); sockfd:=msg.WParam;//в wParam передается дискриптор сокета SockAccepted:=accept(sockfd,addr,i); if SockAccepted=INVALID_SOCKET then begin case WSAGetLastError of ... end; end; WSAAsyncSelect (SockAccepted,Form1.Handle,UM_Read,FD_Read); end; [b]Procedure TForm1.OnDataRead(var msg:TMessage);[/b] var len:integer; str:string; begin // ShowMessage('Read'); if recv (msg.WParam,str,len,0)=SOCKET_ERROR then begin case WSAGetLastError of //... end; end; str:=str+'00000#'; ShowMessage(str); end;
Post #: 1
RE: WinSocket. Ошибка при обработке FD_Read - 2007-04-13 15:25:55.966666   
stasww

Сообщений: 71
Оценки: 0
Присоединился: 2007-03-02 20:15:34.900000
Опять дэлфи ! На Си писал клиентскую часть для дэкдора - в пять строк уместилось[&:]8D
Post #: 2
RE: WinSocket. Ошибка при обработке FD_Read - 2007-04-13 15:31:43.323333   
blacksun

Сообщений: 2360
Оценки: 0
Присоединился: 2006-09-27 03:05:59.350000
Oburec, раз юзаешь VCL можешь и TClientSocket / TServerSocket поюзать ..
Post #: 3
RE: WinSocket. Ошибка при обработке FD_Read - 2007-04-13 19:41:30.893333   
Oburec

Сообщений: 18
Оценки: 0
Присоединился: 2006-12-09 20:19:25.436666
Я на winSocket делаю раз, vcl не причем -исключительно в пробном режиме исполнение на кнопки прикрепил. На Си код будет один в один, у винды функции одни и те же.
Может кто-нибудь хотя бы предположение выскажет в чем может быть проблемма?
Post #: 4
RE: WinSocket. Ошибка при обработке FD_Read - 2007-04-14 15:32:08.190000   
stasww

Сообщений: 71
Оценки: 0
Присоединился: 2007-03-02 20:15:34.900000
На Си ( чуть подругому )
void_fastcall TForm1::TrojControllerRead(TObject *Sender,
TCustromWinSocket *Socket)
{
Memo2->Lines->Add(Socket->ReceiveText());
}
Post #: 5
RE: WinSocket. Ошибка при обработке FD_Read - 2007-04-28 05:08:32.496666   
SPACE101_!2224

Сообщений: 39
Оценки: 0
Присоединился: 2007-04-08 06:32:54.243333
функии ONRead :
 
case msg.LParamLo of
 FD_READ :
 begin
  if  WSAGetSelectError(msg.LParamHi) <> 0 Then exit; //Обработка ошибки

   ReciveLen := recv(msg.WParam,buf,sizeof(buf),0);
   while GetLastError = WSAEWOULDBLOCK do
    ReciveLen := recv(msg.WParam,buf,sizeof(buf),0);

    s := buf; // 's' это строка , buf это array [..] of char , для передачи данных должен быть array [..] of byte.
   // s копирует все до первого встретившегося символа #0 .Поэтому если переменная buf не локальная не забудь
  // сделать так    FillChar(buf,ReciveLen,#0);
    Server.ExecCommand(s,msg.WParam);
//   end;
 end;
 FD_CLOSE :
 begin

 end;
end;
 
В начала функии ONAccept :
 
if (WSAGETSELECTERROR(msg.LParam) <> 0) then
  begin
  end;
 

В функции ListenButtonClick  поменяй местами вызовы :
 
listen(FAcceptSocket,SOMAXCONN);
WSAAsyncSelect(FAcceptSocket,Form1.Handle,WM_CONNECTS,FD_ACCEPT);
 
Сообщи результаты .

Post #: 6
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> WinSocket. Ошибка при обработке FD_Read







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.