안녕하세요 언제나 초보 바보감자입니다 꾸벅..ㅠㅅㅠ
흑흑 지금 이거때문에 엄청 고생했는데 방법을 못찾겠습니다..
고수님들의 조언 을 부탁드리겠습니다...
내용은...
인디 서버와 인디 클라이언트가 있는데..
클라에서 서버로 자료를 보내면 잘받습니다..
문제는 다시 서버에서 보내줘야하는데...
보내주는 루틴은 에러가 안나는데...
클라이언트에서 ReadBuffer <-- 요함수만 들어가면 뻑 멈춰버리네요..
데이타 올때까장 기달리는거같은데...
확실하게 몰르겠습니다..소스 첨부하니 부탁바랍니다..
///////////////////////////////////////////////////////////////
//
//클라이언트 부분..
//
///////////////////////////////////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
var
bcp: BILL_COM_PACKET;
spp: MacsHeaderPkt;
url: string;
begin
with IdTCPClient1 do
begin
Connect;
try
url := 'http://hanmail.net';
GetMem(bcp.data_buff, length(url));
strcopy(@bcp.data_buff, @url);
bcp.BIL.PacketLength := length(url);
WriteBuffer(bcp, sizeof(bcp));
// ReadBuffer(spp.bil, sizeof(spp.bil)); <--문제의부분...ㅡㅡ;;;
finally
Disconnect;
end;
end;
end;
///////////////////////////////////////////////////////////////
//
//서버 부분..
//
///////////////////////////////////////////////////////////////
procedure TForm1.ServerExecute(AThread: TIdPeerThread);
var
bcp: BILL_COM_PACKET;
spp: MacsHeaderPkt;
tmp_buff: string;
begin
with AThread.Connection do
begin
inc(scount);
ReadBuffer(bcp.bil, sizeof(bcp.BIL));
Getmem(bcp.data_buff, bcp.BIL.PacketLength);
ReadBuffer(bcp.data_buff, sizeof(bcp.BIL.PacketLength));
//받기 끝. 보내기 시작.
tmp_buff := cp_bil(string(bcp.data_buff));
GetMem(spp.data_buff, length(tmp_buff));
strcopy(@spp.data_buff, @tmp_buff);
spp.bil.uiLen := length(tmp_buff);
//보내기
WriteBuffer(spp, sizeof(spp));
scount := scount - 1;
Disconnect;
end;
end;
ㅠㅅㅠ
긴 소스 읽어주셔서 감사합니다..별로 길진 않지만 ^^;;;
부탁드리겠습니다. 고수님들... 회사에서 오래 못버티겠군요..ㅠㅠ..
보내는 부분하고 받는 부분하고 다르네요... 그래서 TimeOut걸려서 멈추는거 같군요...
클라이언트에서 보낼때 bcp를 통째로 보내는데 포인터(bcp.data_buff)가 포함되어 있네요. 아시다시피 포인터는 4바이트자료형입니다. bcp를 보내면 bpc.databuff의 값이 보내지는게 아니라 포인터번지가 보내집니다...
보낼때는 포인터 번지를 보내고 받을때는 포인터번지가 가리키는 데이터를 받으니 양쪽의 크기가 안맞죠...
보낼때 아래와 같은 식으로 보내야 될거 같네요...
WriteBuffer(bcp.bil, sizeof(bcp.BIL));
...
WriteBuffer(bcp.data_buff^, sizeof(bcp.BIL.PacketLength));
다시 받을때도 마찬가지로 포인터를 보내고 받지 마세요...
^^ 항상 즐코하세요...