Форум: "Основная";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
ВнизЗакрытие сокета Найти похожие ветки
← →
Игорь_ (2007-08-15 17:21) [0]Уважаемые мастера.
Скажите, как поймать событие отключения сокета с правильным индексом.
По коду поймете.
Когда закрываюсь получаю не тот активный сокет.
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) [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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.10.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c