저는 네트웍 체팅 프로르램을 짤려고 하는 초보 델피언 입니다.
채팅 클라이언트가 실행시 자기 컴퓨터의 IP Address를 읽어서
TClientSocket의 Address에 그 값을 넣고, TClientSocket를 Open
하여 서버에 접속하려고 합니다.
그래서 IP Address를 구하는 소스를 다운받아 실행 해보니까
IP Address는 정확히 구해지는데 TClientSocket를 Open하니까
에러가 발생합니다.
에러 : reised excption class ESocket Error message
'windows Socket error : (10049) on API 'connect'
IP Address 구하는 함수
function IPGet : String;
var
WSAData : TWSADAta;
HostName, Address : String;
HostEnt : PHostEnt;
begin
WSAStartup(2,WSAData);
SetLength(HostName,255);
Gethostname(PCha(HostName),255);
SetLength(HostName,StrLen(PChar(Hostname)));
HostEnt := Gethostbyname(PChar(HostName));
with HostEnt^ do
Address := Format('%d,%d,%d,%d',[Byte(h_addr^[0])
,[Byte(h_addr^[1])
,[Byte(h_addr^[2])
,[Byte(h_addr^[3])]);
WSACleanup;
Result := Address;
end;
실행 부분
begin
clientsocket.address := IPGet;
clientsocket.open
end;
위에서 clientsocket.open 이때 위의 에러 발생
서버 접속 불가 에러와는 다른 에러인것 같습니다.
어떻게 사용하면 에러가 발생하지 않겠습니까.
그리고 위의 함수에서보면 ^기호가 있는데 이것이 무엇을 뜻하는 것입니까
하나만 더 질문 하겠습니다.
채팅 서버와 클라이언트가 같은 컴퓨터에서 실행되는 것은 자료도 좀 있고
한데 한 컴퓨터에 채팅 서버를 띄우고, 다른 컴퓨터에서 클라이언트를 띄워
서버가 있는 컴퓨터고 접속하여 채팅을 하는 것은 자료를 찾을 수가 없습니다.
고수님들 께서 한수 가르쳐 주십시요,
예제 소스가 있으면 정말 감사하겠습니다.
> 저는 네트웍 체팅 프로르램을 짤려고 하는 초보 델피언 입니다.
> 채팅 클라이언트가 실행시 자기 컴퓨터의 IP Address를 읽어서
> TClientSocket의 Address에 그 값을 넣고, TClientSocket를 Open
> 하여 서버에 접속하려고 합니다.
> 그래서 IP Address를 구하는 소스를 다운받아 실행 해보니까
> IP Address는 정확히 구해지는데 TClientSocket를 Open하니까
> 에러가 발생합니다.
> 에러 : reised excption class ESocket Error message
> 'windows Socket error : (10049) on API 'connect'
>
> IP Address 구하는 함수
> function IPGet : String;
> var
> WSAData : TWSADAta;
> HostName, Address : String;
> HostEnt : PHostEnt;
> begin
> WSAStartup(2,WSAData);
> SetLength(HostName,255);
> Gethostname(PCha(HostName),255);
> SetLength(HostName,StrLen(PChar(Hostname)));
> HostEnt := Gethostbyname(PChar(HostName));
> with HostEnt^ do
> Address := Format('%d,%d,%d,%d',[Byte(h_addr^[0])
> ,[Byte(h_addr^[1])
> ,[Byte(h_addr^[2])
> ,[Byte(h_addr^[3])]);
> WSACleanup;
> Result := Address;
> end;
> 실행 부분
> begin
> clientsocket.address := IPGet;
> clientsocket.open
> end;
> 위에서 clientsocket.open 이때 위의 에러 발생
> 서버 접속 불가 에러와는 다른 에러인것 같습니다.
> 어떻게 사용하면 에러가 발생하지 않겠습니까.
>
> 그리고 위의 함수에서보면 ^기호가 있는데 이것이 무엇을 뜻하는 것입니까
>
> 하나만 더 질문 하겠습니다.
> 채팅 서버와 클라이언트가 같은 컴퓨터에서 실행되는 것은 자료도 좀 있고
> 한데 한 컴퓨터에 채팅 서버를 띄우고, 다른 컴퓨터에서 클라이언트를 띄워
> 서버가 있는 컴퓨터고 접속하여 채팅을 하는 것은 자료를 찾을 수가 없습니다.
> 고수님들 께서 한수 가르쳐 주십시요,
> 예제 소스가 있으면 정말 감사하겠습니다.
>
음.... 어디부터 이야기 해야 좋을지....
먼저 님꼐서 만드시려는 프로그램의 문제부터 말하겠습니다..
자신의 IP ADDRESS 를 구하셨는데...
clientsocket.address 는 접속하고자 하는 서버의 IP ADDRESS 를 입력하는 곳입니다.
즉 SERVERSOCKET 이 구동되어 있는 곳의 IP ADDRESS 를 구해 와야 합니다..
자신이 서버가 될수는 있겠지만...
다른 클라이언트가 접속하려면...
문제가 있겠지요...
필수적으로 클라이언트 모듈에서는 서버의 IP어드레스를 알아와서 넣어 주기는 힘듭니다..
INI 파일이나 환경설정 메뉴등을 만들어서 자유롭게 입력하는 것은 가능하겠지만..
그리고...
두번째 질문... ^ 는 번지를 가르킵니다..
그리고 마지막 질문....
이런식으로 생각을 해보지요...
먼저 서버 프로그램을 만들어야 겟지요...
서버에서는 논블럭킹 모드를 사용한다면...
ONCLIENTREAD 에서 다음과 같은 코드를 입력하여야합니다..
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
i: integer;
msg:string;
begin
msg:=socket.ReceiveText;
i := 0;
while true do
begin
try
Serversocket1.Socket.Connections[i].SendText(msg);
inc(i);
except
break;
end;
end
end;
즉 받아온 데이터를 모든 클라이언트에게 던져 주어야 합니다...
이정도면 쉽게 프로그램을 하실수 있을거 같은데....
문제가 있으면 알려주시기 바랍니다...
류민철.