|
TCP를 사용하지 않고 UDP를 사용하여 데이타를 주고 받으려고 합니다.
프로그램이 가동될때
char tempBuff[60];
static int rThread = 0;
SOCKADDR_IN localsin;
GlobalSocket = socket(AF_INET, SOCK_DGRAM, 0);
if(GlobalSocket == INVALID_SOCKET)
{
Memo1->Lines->Add("소켓실패");
closesocket(GlobalSocket);
return;
}
localsin.sin_family = AF_INET;
localsin.sin_addr.s_addr = INADDR_ANY;
localsin.sin_port = htons(2000);
if(bind(GlobalSocket,(SOCKADDR *)&localsin, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
{
wsprintf(tempBuff,"연결실패:%d",WSAGetLastError());
Memo1->Lines->Add(tempBuff);
return;
}
_beginthread(RecvThread, 0, &rThread);
소켓을 열고 상대PC로 데이타를 보낼때 상대편에서 받을 준비가 안되어 있으면
원속에러 10054가 발생합니다. 에러값 : 10054 - The connection is reset by remote side
메시지를 보낼때 상대PC가 받을 준비가 되어있지 않거나 PC가 꺼져 있는 경우입니다.
메시지가 받을 준비가 되어있는 PC에서는 데이타가 제대로 수신됩니다.
그런데 제PC에서 원속에러가 발생된 후에는 다른 PC에서 제PC로 보낸 데이타를 받지 못합니다.
위와 같은 소켓에러가 발생된 후에는 리시브하는 쓰레드가 종료되는 것같습니다.
보내는 메시지는
if( sendto(GlobalSocket, tempBuff,sizeof(tempBuff),(int)NULL,
(SOCKADDR *)&remote_sockaddr_in,sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
{
wsprintf(tempBuff,"보내기 실패:%d",WSAGetLastError());
Form1->Memo1->Lines->Add(tempBuff);
return;
}
위에서 메시지를 보낼때 메시지를 받을 수 없을 때에도 받을 수 있는 PC로만 전송되고
제 PC에서도 다른 곳에서 보내는 메시지를 받으려면 어떻게 해야 하나요.
현재는 소켓에러가 나도 제PC에서 보내는 데이타를 받을 준비가 되어있는 PC에서는 수신이
가능합니다.
위에 보낼때 소켓에러가 발생했을때 리셋시키고 다시 받을 수있는 루틴이 추가되어야 할것같은데
아시는 분 수정해 주시면 감사하겠습니다.
|