WinSocket. Ошибка при обработке FD_Read
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
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<>0 then
begin
case ErrorCode of
...
end;
exit;
end;
WSAAsyncSelect (sockfd,Form1.Handle,UM_DataAccept,FD_Accept);
// Устанавливается прослушивание соединения с клиентом
if Listen(sockfd,20)<>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;
|
|
|
RE: WinSocket. Ошибка при обработке FD_Read - 2007-04-13 15:25:55.966666
|
|
|
stasww
Сообщений: 71
Оценки: 0
Присоединился: 2007-03-02 20:15:34.900000
|
Опять дэлфи ! На Си писал клиентскую часть для дэкдора - в пять строк уместилось[&:]8D
|
|
|
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 поюзать ..
|
|
|
RE: WinSocket. Ошибка при обработке FD_Read - 2007-04-13 19:41:30.893333
|
|
|
Oburec
Сообщений: 18
Оценки: 0
Присоединился: 2006-12-09 20:19:25.436666
|
Я на winSocket делаю раз, vcl не причем -исключительно в пробном режиме исполнение на кнопки прикрепил. На Си код будет один в один, у винды функции одни и те же. Может кто-нибудь хотя бы предположение выскажет в чем может быть проблемма?
|
|
|
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()); }
|
|
|
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); Сообщи результаты .
|
|
|
|
|