[완료] C 소켓프로그래밍에서 sendto, recvfrom에 관해 질문드립니다.
returnSendto=sendto(clientSocket, toServer, BUFFERSIZE1, 0, (struct sockaddr*)&serverAddress, sizeof(serverAddress));//toServer 배열에 대입된 메시지를 서버로 전송한다 if(returnSendto!=-1)//전송 성공시 전송한 문자를 화면에 출력 { printf("%c", toServer[0]); }
Client소스 중 sendto부분 입니다. sendto로 전송후 returnSendto변수에 리턴값을 받아 전송 성공시에만 그 내용을 출력하도록 하였습니다. toServer이 서버로 전송할 문자열이며, 한글자씩 전송하도록 하였습니다.(toServer[0]에 문자를 받고, soServer[1]에는 NULL값을 넣어 문자열로 전송하도록 하였습니다.)
while(1) { recvfrom(serverSocket, fromClient, BUFFERSIZE1, 0, (struct sockaddr*)&clientAddress, &clientAddress_size); strupr(fromClient);//소문자를 대문자로 변환 fprintf(fWrite, "%c", fromClient[0]); printf("%c", fromClient[0]); }
Sever쪽 소스이며 Client에서 전송한 메시지를 받아 소문자->대문자로 변환하여 파일에 출력하도록 하였습니다.
첫번째 질문입니다.
sendto, recvfrom 함수 각각 전송/수신 실패시 -1값을 리턴하는 것으로 알고있습니다. 그런데 UDP는 메시지 전송후 그 메시지가 제대로 전송되었는지 확인하지 않는 것으로 알고 있습니다. 그렇다면 Client에서 sendto로 전송이 성공하였다고해서 무조건 Sever에서 recvfrom으로 수신한다고 볼 수 없지 않은지요? sendto, recvfrom함수의 송신/수신의 성공/실패가 정확히 어떤 의미를 갖는지 애매하기에 질문드립니다.
두번째 질문입니다.
Server에서 무한루프내에서 메시지를 수신합니다. Client에서 모든 메시지 전송이 완료되고, Server에서 모든 수신이 완료되면 루프를 빠져나가고 싶은데 어떻게 해야할지 감이 잡히질 않습니다. Client에서 NULL값을 전송하면 Sever에서 마지막 데이터가 전송되었다고 판단하고 종료하면 될 것이라 생각하는데 조언 부탁드립니다.
gilgil.net
> sendto, recvfrom 함수 각각 전송/수신 실패시 -1값을 리턴하는 것으로 알고있습니다. 그런데 UDP는 메시지 전송후 그 메시지가 제대로 전송되었는지 확인하지 않는 것으로 알고 있습니다. 그렇다면 Client에서 sendto로 전송이 성공하였다고해서 무조건 Sever에서 recvfrom으로 수신한다고 볼 수 없지 않은지요? sendto, recvfrom함수의 송신/수신의 성공/실패가 정확히 어떤 의미를 갖는지 애매하기에 질문드립니다.
sendto 가 성공하는 것은 자신의 Host로부터의 전송이 성공했음을 의미하지, 수신측에서 성공적으로 수신된 것을 보장하지는 않습니다.
> Server에서 무한루프내에서 메시지를 수신합니다. Client에서 모든 메시지 전송이 완료되고, Server에서 모든 수신이 완료되면 루프를 빠져나가고 싶은데 어떻게 해야할지 감이 잡히질 않습니다. Client에서 NULL값을 전송하면 Sever에서 마지막 데이터가 전송되었다고 판단하고 종료하면 될 것이라 생각하는데 조언 부탁드립니다.
Application 레벨에서 처리를 해 줘야 합니다. 통신의 가장 마지막을 나타내는 메세지를 클라이언트에서 서버로 보내도록 프로토콜을 구성해야 겠죠.
www.gilgil.net
답변 감사합니다.
두 질문에 대한 답변 모두 이해가 갔습니다. 감사합니다.
댓글 달기