22. marts 2002 - 15:07Der er
4 kommentarer og 1 løsning
Bar bund...
Jeg har et ret stort problem som jeg simpelthen ikke kan finde ud af hvordan opstår..
Jeg er ved at lave en irc klient/bot som skal connecte til irc netværket via en tcp/ip forbindelse, jeg bruger komponenten ClientSocket til at skabe denne forbindelse,
Jeg er efterhånden ved at være et godt stykke med arbejdet af programmet, men jeg er begyndt at få denne besked smidt i hovedet når jeg prøver at skabe en forbindelse via Tcp/ip:
"Project Project1.exe raised exception class ESocketError with message "Windows socket error: The requested name is valid and was found in the database, but it does not have the correct associated data being resolved for (11004), on API 'ASync lookup'". Process stopped. Use Step or Run to continue."
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
For at kunne lave en IRC-client, skal du have et komponenent ved navn WSocket, jeg ved ikke helt hvor den downloades, men jeg har lige bixet lidt sammen til dig:
procedure TfrmMain.SlyIrcResponse(Sender: TObject; ATokens: TIrcToken; var Suppress: Boolean); var Line: String; Index: Integer; begin if chkShowTokens.Checked then begin Line := '"' + ATokens[0] + '"'; for Index := 1 to ATokens.Count - 1 do Line := Line + ', "' + ATokens[Index] + '"'; memStatus.Lines.Add(Line); end; end;
procedure TfrmMain.edtCommandKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin { Suppress beep. } Key := #0; FSlyIrc.Send(edtCommand.Text); edtCommand.Text := ''; end; end;
procedure TfrmMain.SlyIrcUserModeChanged(Sender: TObject); begin memStatus.Lines.Add('User mode changed'); end;
procedure TfrmMain.chkInvisibleClick(Sender: TObject); begin if chkInvisible.Checked then FSlyIrc.UserModes := FSlyIrc.UserModes + [umInvisible] else FSlyIrc.UserModes := FSlyIrc.UserModes - [umInvisible]; end;
procedure TfrmMain.chkServerNoticesClick(Sender: TObject); begin if chkServerNotices.Checked then FSlyIrc.UserModes := FSlyIrc.UserModes + [umServerNotices] else FSlyIrc.UserModes := FSlyIrc.UserModes - [umServerNotices]; end;
procedure TfrmMain.chkWallopsClick(Sender: TObject); begin if chkWallops.Checked then FSlyIrc.UserModes := FSlyIrc.UserModes + [umWallops] else FSlyIrc.UserModes := FSlyIrc.UserModes - [umWallops]; end;
end.
Og SlyIRC-komponenten skal se sådan ud: unit SlyIrc;
constructor TIrcObject.Create(AOwner: TIrcObject); begin inherited Create;
SetOwner(AOwner);
if Assigned(FOwner) then SetSlyIrc(FOwner.SlyIrc); end;
destructor TIrcObject.Destroy; begin
SetOwner(nil); inherited; end;
procedure TIrcObject.Notification(AIrcObject: TIrcObject; Operation: TOperation); begin
end;
procedure TIrcObject.PrivMsg(Text: String); begin
end;
procedure TIrcObject.Notice(Text: String); begin
end;
procedure TIrcObject.SetData(const Value: TObject); begin FData := Value; end;
procedure TIrcObject.SetOwner(const Value: TIrcObject); begin if FOwner <> Value then begin
if Assigned(FOwner) then FOwner.Notification(Self, opRemove); FOwner := Value;
if Assigned(FOwner) then FOwner.Notification(Self, opInsert); end; end;
procedure TIrcObject.SetSlyIrc(const Value: TSlyIrc); begin FSlyIrc := Value; end;
procedure TIrcObject.SetTag(const Value: Integer); begin FTag := Value; end;
constructor TIrcToken.Create; begin FTokens := TList.Create; FSyntax := tsResponse; end;
destructor TIrcToken.Destroy; begin if Assigned(FTokens) then FTokens.Free; end;
function TIrcToken.GetTokens(Index: Integer): String; var TokenStart, TokenEnd: PChar; begin Result := ''; if Index < FCount then begin TokenStart := FTokens[Index]; if TokenStart = nil then Exit; TokenEnd := nil; if Index < FTokens.Count - 1 then TokenEnd := StrScan(TokenStart, TOKEN_SEPARATOR); if TokenEnd = nil then
function TIrcToken.GetTokensFrom(Index: Integer): String; var TokenStart: PChar; begin Result := ''; if Index < FCount then begin TokenStart := FTokens[Index]; if TokenStart = nil then Exit;
StrLCopy(FBuffer, TokenStart, High(FBuffer)); Result := StrPas(FBuffer); end; end;
procedure TIrcToken.SetSyntax(const Value: TTokenSyntax); begin FSyntax := Value; end;
procedure TIrcToken.SetTokenString(const Value: String); begin
if FSyntax = tsCTCP then FTokenString := Copy(Value, 2, Length(Value) - 2) else FTokenString := Value;
Tokenize; end;
procedure TIrcToken.Tokenize; var TokenPtr: PChar; EndOfTokens: Boolean; begin FTokens.Clear; FCount := 0; if Length(FTokenString) > 0 then begin TokenPtr := PChar(FTokenString);
while (TokenPtr^ <> #0) and (TokenPtr^ = TOKEN_SEPARATOR) do Inc(TokenPtr);
if TokenPtr^ = #0 then Exit; if FSyntax = tsResponse then begin if TokenPtr^ <> ':' then begin
FTokens.Add(nil); Inc(FCount); end else begin
Inc(TokenPtr); end; end;
FTokens.Add(TokenPtr); Inc(FCount); while TokenPtr <> nil do begin
if TokenPtr^ = #1 then begin TokenPtr := StrScan(TokenPtr + 1, #1);
if TokenPtr <> nil then Inc(TokenPtr); end else begin TokenPtr := StrScan(TokenPtr, TOKEN_SEPARATOR); end; while (TokenPtr <> nil) and (TokenPtr^ <> #0) and (TokenPtr^ = TOKEN_SEPARATOR) do Inc(TokenPtr); if TokenPtr <> nil then begin EndOfTokens := (FSyntax = tsResponse) and (TokenPtr^ = TOKEN_ENDOFTOKENS); if EndOfTokens then Inc(TokenPtr); if TokenPtr^ <> #0 then begin FTokens.Add(TokenPtr); Inc(FCount); end; if EndOfTokens then Break; end; end; end; end;
function TIrcResponseHandlers.AddHandler(Response: String; HandlerFunc: THandlerFunc): Integer; var Handler: PResponseHandler; begin Result := IndexOfHandler(Response); if Result >= 0 then begin
procedure TIrcResponseHandlers.DeleteHandler(Index: Integer); var Handler: PResponseHandler; begin if (Index >= 0) and (Index < FHandlers.Count) then begin Handler := PResponseHandler(FHandlers.Objects[Index]); if Handler^.PrevHandler <> nil then FHandlers.Objects[Index] := TObject(Handler^.PrevHandler) else FHandlers.Delete(Index); Dispose(Handler); end; end;
destructor TIrcResponseHandlers.Destroy; begin while FHandlers.Count > 0 do DeleteHandler(0); FHandlers.Free; inherited; end;
procedure TIrcResponseHandlers.Handle(Tokens: TIrcToken); var Index: Integer; Handler: PResponseHandler; BreakChain: Boolean; begin Index := IndexOfHandler(Tokens[1]); if Index >= 0 then begin Handler := PResponseHandler(FHandlers.Objects[Index]); BreakChain := False; while Assigned(Handler) and not BreakChain do begin if Assigned(Handler^.HandlerFunc) then Handler^.HandlerFunc(FSlyIrc, Tokens[1], Tokens, BreakChain); Handler := Handler^.PrevHandler; end; end; end;
function TIrcResponseHandlers.IndexOfHandler(Response: String): Integer; begin Result := FHandlers.IndexOf(Response); end;
procedure TIrcResponseHandlers.RemoveHandler(Response: String); begin DeleteHandler(IndexOfHandler(Response)); end;
procedure TSlyIrc.Close; begin
if FState = isReady then begin SetState(isDisconnecting); Send('QUIT'); end else begin if Assigned(FWSocket) then begin SetState(isDisconnecting); FWSocket.Close; end; end; end;
procedure TSlyIrc.Connect; begin if Assigned(FWSocket) and (FState = isNotConnected) then begin FActualHost := FHost; FActualNick := FNick; FChangeNickTo := ''; SetState(isResolvingHost); FWSocket.DnsLookup(FHost); end; end;
procedure TSlyIrc.DataAvailable(Sender: TObject; Error: Word); var AResponse: String; Suppress: Boolean; EndOfLineChars: Integer; begin if Error <> 0 then begin Reset; end else begin AResponse := FWSocket.ReceiveStr; if Length(AResponse) > 0 then begin EndOfLineChars := 1; if AResponse[Length(AResponse) - 1] = #13 then Inc(EndOfLineChars); SetLength(AResponse, Length(AResponse) - EndOfLineChars); Receive(AResponse); Suppress := False; ProcessResponse(AResponse, Suppress); end; end; end;
destructor TSlyIrc.Destroy; begin Reset; if Assigned(FWSocket) then FWSocket.Free; if Assigned(FTokens) then FTokens.Free; FHandlers.Free; inherited; end;
procedure TSlyIrc.DnsLookupDone(Sender: TObject; Error: Word); begin if Error <> 0 then begin Reset; end else begin SetState(isConnecting); FWSocket.Addr := FWSocket.DnsResult; FWSocket.Port := FPort; FWSocket.Connect; end; end;
procedure TSlyIrc.Notification(AComponent: TComponent; Operation: TOperation); begin inherited; if (Operation = opRemove) and (AComponent = FWSocket) then FWSocket := nil; end;
procedure TSlyIrc.Reset; begin SetState(isAborting); if Assigned(FWSocket) then FWSocket.Abort; end;
procedure TSlyIrc.Send(Command: String); begin if Assigned(FOnSend) then FOnSend(Self, Command); if Assigned(FWSocket) and (FState in [isRegistering, isReady]) then FWSocket.SendStr(Command + #13#10); end;
procedure TSlyIrc.SessionClosed(Sender: TObject; Error: Word); begin if Error <> 0 then Reset else SetState(isNotConnected); end;
procedure TSlyIrc.SessionConnected(Sender: TObject; Error: Word); begin if Error <> 0 then begin Reset; end else begin SetState(isConnected); SetState(isRegistering); if FPassword <> '' then Send(Format('PASS %s', [FPassword]));
procedure TSlyIrc.SetAltNick(const Value: String); begin FAltNick := Value; end;
procedure TSlyIrc.SetNick(const Value: String); begin if Length(Value) > 0 then begin if FState in [isRegistering, isReady] then begin if Value <> FChangeNickTo then begin Send(Format('NICK %s', [Value])); FChangeNickTo := Value; end; end else begin FNick := Value; end; end; end;
procedure TSlyIrc.SetPassword(const Value: String); begin FPassword := Value; end;
procedure TSlyIrc.SetPort(const Value: String); begin FPort := Value; end;
procedure TSlyIrc.SetRealName(const Value: String); begin FRealName := Value; end;
procedure TSlyIrc.SetHost(const Value: String); begin FHost := Value; end;
procedure TSlyIrc.SetUsername(const Value: String); begin FUsername := Value; end;
procedure TSlyIrc.SetState(const Value: TSlyIrcState); begin if Value <> FState then begin if Assigned(FOnBeforeStateChange) then FOnBeforeStateChange(Self);
FState := Value;
if Assigned(FOnAfterStateChange) then FOnAfterStateChange(Self); end; end;
function TSlyIrc.GetUserModes: TUserModes; begin if FState in [isRegistering, isReady] then Result := FActualUserModes else Result := FUserModes; end;
procedure TSlyIrc.SetUserModes(const Value: TUserModes); var ModeString: String; begin if FState in [isRegistering, isReady] then begin ModeString := CreateUserModeCommand(Value); if Length(ModeString) > 0 then Send(Format('MODE %s %s', [FActualNick, ModeString])); end else begin FUserModes := Value; end; end;
procedure TSlyIrc.ProcessResponse(AResponse: String; var Suppress: Boolean); begin FTokens.Syntax := tsResponse; FTokens.TokenString := AResponse; FHandlers.Handle(FTokens);
function TSlyIrc.GetHost: String; begin if FState in [isRegistering, isReady] then Result := FActualHost else Result := FHost; end;
function TSlyIrc.GetNick: String; begin if FState in [isRegistering, isReady] then Result := FActualNick else Result := FNick; end;
function TSlyIrc.ExtractNickFromAddress(Address: String): String; var EndOfNick: Integer; begin Result := ''; EndOfNick := Pos('!', Address); if EndOfNick > 0 then Result := Copy(Address, 1, EndOfNick - 1); end;
procedure TSlyIrc.RplNick(SlyIrc: TSlyIrc; AResponse: String; ATokens: TIrcToken; var BreakChain: Boolean); begin if UpperCase(ExtractNickFromAddress(ATokens[0])) = UpperCase(FActualNick) then FActualNick := ATokens[2]; end;
procedure TSlyIrc.RplPing(SlyIrc: TSlyIrc; AResponse: String; ATokens: TIrcToken; var BreakChain: Boolean); begin SlyIrc.Send(Format('PONG %s', [ATokens[2]])); end;
procedure TSlyIrc.RplWelcome1(SlyIrc: TSlyIrc; AResponse: String; ATokens: TIrcToken; var BreakChain: Boolean); begin FActualHost := ATokens[0]; FActualNick := ATokens[2]; SetState(isReady); if FUserModes <> [] then Send(Format('MODE %s %s', [FActualNick, CreateUserModeCommand(FUserModes)])); end;
procedure TSlyIrc.ErrNicknameInUse(SlyIrc: TSlyIrc; AResponse: String; ATokens: TIrcToken; var BreakChain: Boolean); begin if FState = isRegistering then begin if FChangeNickTo = FNick then SetNick(FAltNick) else Quit('Nick conflict'); end; end;
function TSlyIrc.CreateUserModeCommand(NewModes: TUserModes): String; const ModeChars: array [umInvisible..umWallops] of Char = ('i', 'o', 's', 'w'); var ModeDiff: TUserModes; Mode: TUserMode; begin Result := ''; ModeDiff := FActualUserModes - NewModes; if ModeDiff <> [] then begin Result := Result + '-'; for Mode := Low(TUserMode) to High(TUserMode) do begin if Mode in ModeDiff then Result := Result + ModeChars[Mode]; end; end; ModeDiff := NewModes - FActualUserModes; if ModeDiff <> [] then begin Result := Result + '+'; for Mode := Low(TUserMode) to High(TUserMode) do begin if Mode in ModeDiff then Result := Result + ModeChars[Mode]; end; end; end;
procedure TSlyIrc.RplMode(SlyIrc: TSlyIrc; AResponse: String; ATokens: TIrcToken; var BreakChain: Boolean); var Index: Integer; ModeString: String; AddMode: Boolean; begin if ATokens[2] = FActualNick then begin ModeString := ATokens[3]; AddMode := True; for Index := 1 to Length(ModeString) do begin case ModeString[Index] of '+': AddMode := True; '-': AddMode := False; 'i': if AddMode then FActualUserModes := FActualUserModes + [umInvisible] else FActualUserModes := FActualUserModes - [umInvisible]; 'o': if AddMode then FActualUserModes := FActualUserModes + [umOperator] else FActualUserModes := FActualUserModes - [umOperator]; 's': if AddMode then FActualUserModes := FActualUserModes + [umServerNotices] else FActualUserModes := FActualUserModes - [umServerNotices]; 'w': if AddMode then FActualUserModes := FActualUserModes + [umWallops] else FActualUserModes := FActualUserModes - [umWallops]; end; end; UserModeChanged; end; end;
Jeg havde ingen problemer med at bruge den ClientSocket komponent, Men den er pludselig kommet op med denne underlige fejl, jeg har ingen ide om hvorfor...
Du skal i den ClientSockets OnError event tage højde for at der kan opstå problemer med forbindelsen. Du skal altså lave noget kode som kan fange de forskellige fejl
Ved ikke helt hvad problemet var, lige pludselig forsvandt det bare..
Jeg mistænker mine ram da de er begyndt at opføre sig underligt..
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.