|
박지훈.임프 님이 쓰신 글 :
: ant 님이 쓰신 글 :
: : 안녕하세요 하나의 함수에서 소켓에 읽고 쓰고에
: : 관하여 다시 질문을 올립니다.
: :
: : 제가 mfc로 짰던 소스는 다음과 같습니다.
: :
: : void Test::Check_Servers()
: : {
: : CSocket socket;//소켓 선언
: : char cBuf[10];
: :
: : memset (&cBuf, 0x00, sizeof(cBuf));
: : strcpy(cBuf, "ALIVE?");
: : socket.Create();
: :
: : //------ 타임 아웃 설정 ------
: : int milli_secs = 0L;
: : int receive_time_out = 20;
: :
: : if (receive_time_out < INT_MAX/1000)
: : milli_secs = receive_time_out * 1000;
: : else
: : milli_secs = 100000;
: :
: : if (!socket.SetSockOpt(SO_RCVTIMEO, (const char*)&milli_secs, sizeof(milli_secs)))
: : {
: : TRACE("Failed Socket RCV Option.\n");
: : return;
: : }
: : if (!socket.SetSockOpt(SO_SNDTIMEO, (const char*)&milli_secs, sizeof(milli_secs)))
: : {
: : TRACE("Failed Socket SND Option.\n");
: : return;
: : }
: :
: : if (!socket.Connect("111.111.111.111", 8000))//접속
: : {
: : TRACE("Failed Socket Connection.\n");
: : return;
: : }
: :
: : //--- sending request message
: : if (socket.Send(&cBuf, sizeof(cBuf)) == SOCKET_ERROR)//송신
: : {
: : TRACE("Failed Socket Send.\n");
: : return;
: : }
: :
: : memset (&cBuf, 0x00, sizeof(cBuf));
: : if (socket.Receive(&cBuf, sizeof(cBuf)) == SOCKET_ERROR)//수신
: : {
: : TRACE("Failed Socket Receive.\n");
: : return;
: : }
: : socket.Close();//소켓을 닫는다.
: : AfxMessageBox("Succeed!!");
: : }
: :
: : 물론 간략화 시킨 소스이고요.
: :
: : 위와 같이 하나의 함수 안에서 소켓에 쓰고 읽고를
: : 하여서 해당 리모트의 상태를 알도록 하였습니다.
: :
: : 빌더에서는 다른 이벤트 핸들러에서 읽고 쓰는 것이
: : 아닌 하나의 함수에서 위와 같은 일이 가능한가요?
: :
:
:
:
: 임펠리테리입니다.
:
: 소스를 보니, 클라이언트 부분이군요. 소켓을 열어서 커넥트를 하고, 먼저 데이터를 보낸 후 다시 받도록 되어있네요.
:
: 빌더에서 이와같이 하려면, 먼저 TClient 소켓을 하나 폼에 놓고, 프로퍼티를 다음과 같이 설정합니다. 먼저 Address를 접속할 컴퓨터의 주소로 설정합니다. (만약 주소가 IP가 아니라 도메인 주소라면 Host 프로퍼티에 설정합니다) 그리고 ClientType을 ctBlocking로 설정합니다.
:
: 그런 후, 실제로 동작을 시작하기 위해 버튼을 하나 놓고 더블클릭해서 OnClick 이벤트 핸들러의 뼉다구를 만든 다음, 대충 다음과 같이 코딩하세요.
: ClientSocket1->Open();
: ClientSocket1->Socket->SendBuf(버퍼, 버퍼사이즈);
: ClientSocket1->Socket->ReceiveBuf(버퍼, 버퍼사이즈);
:
: 블러킹 모드이기 때문에 이벤트를 사용하지 않고, 그래서 MFC코드나 별로 다른 게 없지요?
: 그럼 참고하시길...
답변에 감사 드립니다.
귀찮게 해드려 죄송하지만 포트에 관하여 한번 더 질문을 드립니다.
리모트 컴에는 각각 고유의 IP와 포트를 가지고 있는데요...
클라이언트의 소켓에서 포트 프러퍼티를 소스상에서 할당을 하면
링크에러가 납니다.
그 내용은:
TAbstractSocket::SetPortA(int) referenced from ~~~~.obj
입니다.
그 소스의 내용은 아래와 같습니다.
AnsiString strParam1 = "111.111.111.111";
int iParam1 = 8000;
if(ClientSocket1->Active)
ClientSocket1->Active = false;
ClientSocket1->Address = StrParam1;
ClientSocket1->Port = iParam1;
ClientSocket1->Active = true;
ClientSocket1->Socket->SendBuf(버퍼, 버퍼사이즈);
ClientSocket1->Socket->ReceiveBuf(버퍼, 버퍼사이즈);
그렇다면 빌더에서는 소스상에서 포트 번호를 가변적으로
조정을 할 수 없다는 얘기 입니까?
아니면 제가 뭐 이상한 짓을 한것인가요?
아시는 분들의 답변을 기다립니다.
|