2011-03-10 11 views
0

C. (Linux)sendto 함수로 이상한 결과를 얻었습니다. 신뢰할 수있는 UDP 종류를 구현하는 것입니다. 계획.C sendto가 때때로 작동합니다 ... 아무런 오류가 없었습니다 ... no ERRORS

아래 제공된 코드 스 니펫은 패킷이 삭제 될 때 만료되고 해당 패킷을 다시 전송하는 프로세스에 메시지를 보내는 타이머의 일부입니다. 나는 데

이상한 문제는 큰 파일을 전송할 때> 300킬로바이트 아래에 주어진 코드 (즉, ELSE 부분이 실행됩니다) 그러나 패킷의 특정 숫자 후 전송 완벽하게 작동합니다 ... 말할 것입니다. .. 그 부분을 실행합니다. !!!

코드가 약 250 패킷 BUT 251 PACKET kabooom 함께 잘 작동하기 때문 이상한 !!!

n = sendto(sockfd, &(forwardPeer->id), sizeof(forwardPeer->id), 0, (struct sockaddr*)&tcpd_addr, sizeof(tcpd_addr)); 
if(n<0) 
    printf("\n error sending to tcpdc"); 
else 
    printf("\n message sent to tcpdc");  

제발 도와주세요! 미리 알아 두십시오.

+1

오류가 발생했을 때'strerror (errno)'를 출력하면, 무슨 일이 일어 났는지 알 수 있습니다. –

+0

Error :: 잘못된 파일 기술자 ... Perl ... –

+0

신뢰할 수있는 데이터 그램 프로토콜 - hmmm .... –

답변

1

Bad file descriptor 오류는 전달 된 sockfd 값이 잘못되었음을 의미합니다. 다음 중 하나 :

  • 파일 설명자가 닫혔습니다. 또는
  • 해당 변수의 값이 프로그램의 바운드 오버 플로우로 인해 junk에 의해 덮어 써졌습니다.

는 두 번째 경우를 잡을 디버거에서 프로그램을 실행하고 sockfd 변수에 대한 감시 점 설정하려면 -이이 변경되는 어디에하도록해야 값 변경, 당신이 볼 whenver 디버거에 침입 것이다 때 shouldn 그러지 마라.

valgrind에서 프로그램을 실행하고보고 한 문제를 해결할 수도 있습니다.