|
원래 그렇게 쓰나요?? Cuperido.. 프로그램 잘 짜시니까 맞겠죠??
신인도는 있습니다 ㅎ
저는 그렇게 안쓰구요''; 개인적으로 프로토콜을 지정해서 사용 하는데요
read 부분에
AnsiString Text = Socket->ReceiveText;
if(Text.Pos("자기가지정한프로토콜"))
{
여기서 해야 할 작업들을 해야 겠죠.
}
else if (Text.Pos("자기가지정한 다른 프로토콜"))
{
여기서도 다른 작업을 처리 해야겠죠.
}
이런식으로 짰는데'';
이것도 별 문제 없이 잘 되더군요 ㅎ
유영인 Cuperido 님이 쓰신 글 :
: if(받은 데이터가 있으면)
:
: 이 처리를 어떻게 해주셨냐에 따라서 결과가 틀려질 수 있을것 같네요.
:
: 아마도, select 를 이용해서 전부 다 긁어보신다음 마지막
: 연결 핸들로 데이터 여부를 판단하시지 않았나 싶습니다.. :D
:
: 보통은.. 아래와 같이 움직입니다.
:
: fd_set fdSockCheck;
: int itCount, itTemp, itReadBytes, itAddressLength, itPlayer;
: static struct timeval ssTime = {0L, 5000L};
: struct sockaddr_in siAddress;
: char caQueue[QUEUESIZE + 1];
:
:
: // UDP 처리 때문에 Read 딜레이를 두지 않음
: ssTime.tv_usec = 5000L;
: itAddressLength = sizeof(siAddress);
: fdSockCheck = fdSockets;
:
: if(select(TABLESIZE, &fdSockCheck, 0, 0, &ssTime) > 0) {
: itReadBytes = recvfrom(UDPSocket, BUFFER, IBUFSIZE, 0, (struct sockaddr*)&siAddress, &itAddressLength);
:
: if(itReadBytes >= 1) {
: ... 읽기 처리 루틴 ...
: }
: }
:
: return(0);
:
:
:
: 박기홍 님이 쓰신 글 :
: : 또 이런 초보적인 질문을 합니다..
: : 이해가 안가는 부분이 있어서 인데요..
: :
: : 아주 간단하게 c/s 프로그램을 만들었습니다.
: : 쓰레드를 이용해서 여러명이 접속도 가능하게 했구요..
: :
: : 제가 궁금한것은.. 서버에서
: :
: : accpet 부분을 쓰레드 안에서 시행하게 했습니다.
: : 그리고 accept에 성공하면
: : 또 다른 쓰레드로 recv()를 돌려서 클라이언트에게
: : 받은 메시지가 있으면 메시지 박스를 띄었구요..
: : 아래를 보시면 이해가 더 빠르실거에요..
: :
: : [[ thread1 ]]
: : for(;;) {
: : if( accept성공 )
: : {
: : MessageBox(접속성공);
: : thread2 호출;
: : }
: : }
: :
: : [[ thread2 ]]
: : for(;;) {
: : if( 받은데이터가 있으면)
: : {
: : MessageBox(받은데이터 출력);
: : }
: : }
: :
: :
: : 이런 식으로 했는데..
: : 클라이언트 프로그램을 여러개 띄어놓고 테스트를 해보면..
: : 클라이언트들이 접속할때마다 서버에서는 "접속성공"이라는 메시지를 보여줍니다.
: :
: : 하지만 클라이언트의 (테스트용으로 만든) 메시지를 보내기 버튼을 누르면
: : 마지막에 접속에 성공한 클라이언트의 메시지만 뿌려주고요..
: : 그 전에 접속해있던 클라이언트의 메시지보내기버튼을 누르면 아무 반응도 안하더군요..
: :
: :
: : 제가 생각할때는 이런식으로 하면 당연히 될줄 알았는데.. -_-;;
: : 항상 도움만 받아서 죄송합니다~
: :
: : 방법에 문제가 있다거나 하는 부분을 가르쳐주시면 감사하겠습니다. ^^
|