![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Закрытие сокета [D6]
Игорь_ © (2007-08-15 17:21:00)Уважаемые мастера.
Скажите, как поймать событие отключения сокета с правильным индексом.
По коду поймете.
Когда закрываюсь получаю не тот активный сокет.
procedure StartServer;
var
par:Integer;
WSAData:PWSAData;
begin
//инициализируемся
New(WSAData);
if WSAStartup(MakeWord(1,1),WSAData^) <>0 then
begin
ErrorCode:=WSAGetLastError;
MessageBox(0,PChar('Ошибка при загрузке Winsock. Код ошибки: ' + IntToStr(ErrorCode)),ServerName,0);
Dispose(WSAData);
Exit;
end;
if WSAData <> nil then
Dispose(WSADAta);
ZeroMemory(@ClientSockets,Sizeof(ClientSockets));
//создаем сокет
sServ:= socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if sServ = INVALID_SOCKET then
begin
ErrorCode:=WSAGetLastError;
MessageBox(0,PChar('Ошибка создания сокета. Код ошибки: ' + IntToStr(ErrorCode)),ServerName,0);
Exit;
end;
WinSock.ioctlsocket(sServ,FIONBIO,par);
//связывание сокета с адресом и портом
Addr.sin_family:=AF_INET;
Addr.sin_port:=htons(MainPort);
Addr.sin_addr.S_addr:=htonl(INADDR_ANY);//WinSock.inet_addr({PChar(GetLocalIP)}
//проверим связывание
if bind(sServ,Addr,Sizeof(Addr)) = SOCKET_ERROR then
begin
ErrorCode:=WSAGetLastError;
MessageBox(0,PChar('Ошибка связывания сокета. Код ошибки: ' + IntToStr(ErrorCode)),ServerName,0);
Exit;
end;
//ожидание запросов клиента на соединение
if WinSock.listen(sServ,MaxClient) = SOCKET_ERROR then
begin
ErrorCode:=WSAGetLastError;
MessageBox(0,PChar('Ошибка ожидания сокета. Код ошибки: ' + IntToStr(ErrorCode)),ServerName,0);
Exit;
end;
// SendMessage(lab_, LB_ADDSTRING, 0, LongInt(PChar(Done + #32 + GetDate + #32 + GetTime)));
// SendMessage(lab_, LB_ADDSTRING, 0, LongInt(PChar(Listen)));
//связываем сообщения с окном
WinSock.WSAAsyncSelect(sServ,LocalAPP,WM_ASYNC_CLIENTEVENT,FD_ACCEPT or FD_READ or FD_WRITE or FD_CONNECT or FD_CLOSE);
end;
function MainWndProc(hWindow: HWND; Msg: UINT; wParam: wParam;
lParam: lParam): LRESULT; stdcall; export;
var
ps: TPaintStruct;
begin
Result := 0;
case Msg of
WM_CREATE:
begin
LocalAPP:=hWindow;
end;
WM_PAINT:
begin
BeginPaint(hWindow, ps);
SetBkMode(ps.hdc, TRANSPARENT);
EndPaint(hWindow, ps);
end;
WM_CLOSE:
begin
StopServer;
PostQuitMessage(0);
Result:=0
end;
WM_ASYNC_CLIENTEVENT:
begin
WSAEvent:=WinSock.WSAGetSelectEvent(lparam);
case WSAEvent of
FD_ACCEPT:
begin
//получаю число от wparam
AddClientToServer(wparam);
end;
FD_READ:
begin
end;
FD_WRITE:
begin
end;
FD_CLOSE:
begin
//получаею от wparam совсем другое число, которое получилось
на соединении - как побороть ?
CloseActiveSocket(wParam);
//
end;
end;
Result:=0;
end;
WM_DESTROY: PostQuitMessage(0);
else
begin
Result := DefWindowProc(hWindow, Msg, wParam, lParam);
Exit;
end;
end;
end;
Игорь_ (2007-08-15 17:23:00) [1]Забыл назвать переменные и константы:
const
MaxClient = High(Word);//êîëè÷åñòâî ñîêåòíûõ ãíåçä
MainPort = 35000; //Ãëàâíûé ïîðò ñåðâåðà
Lab = 'Çàãðóçêà ñåðâåðà ';
FServer = 'Ñåðâåð';
Diprom = 'Äèïðîì: ';
Done = FServer + ' çàïóùåí ';
Listen = 'Îæèäàíèå ...';
AcceptClient = 'Ñîåäèíåíèå ñ êëèåíòîì óñòàíîâëåíî.';
Client = 'Êëèåíò';
Connect = 'ïîäêëþ÷åí';
Disconnect = 'îòêëþ÷åí';
Stop = 'îñòàíîâëåí';
ConnectCount = 'Êîëè÷åñòâî ïîäêëþ÷åííûõ êëèåíòîâ:';
ConnectRealyCount = 'Êîëè÷åñòâî äåéñòâèòåëüíû 245; êëèåíòîâ:';
ServerName = Diprom + FServer + ' SF-36';
Width = 500;
Height = 290;
WM_ASYNC_CLIENTEVENT = WM_USER + 14;
var
wc: TWndClass;
hWindow: HWND;
Msg: TMsg;
addr,ClientAddr:TSockAddrin;
ClientSockets:array[0..MaxClient-1] of TSocket;
sServ:TSocket;
ErrorCode:Integer;
localAPP:HWND;
count:integer;
WSAEvent:Word;