2014-12-23 1 views
2

gcc 컴파일러에서 경고가 표시되지 않습니다. 경고 : warning: pointer targets in passing argument 6 of ‘recvfrom’ differ in signedness 모르겠다. 문제가있는 곳에서 signed and unsigned 값을 사용하고 있지 않습니다.서명의 차이 - 경고

문제는 라인에 :

recvfrom(server_socket, inputbuffer, maxLenght, 0, (struct sockaddr*) remote_addr, &server_addr_len); 

내가이 시도 :

recvfrom(server_socket, inputbuffer, maxLenght, 0, (unsigned int) remote_addr, &server_addr_len); 

를하지만 나에게 도움이되지 않았다. 조언과 설명에 감사드립니다.

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, 
        struct sockaddr *src_addr, socklen_t *addrlen); 

recvfrom()socklen_t 6 번째로 parame을 기대 :

+0

어느 것이 6 번째 인수입니까? –

답변

3

man recvfrom()에서입니다 server_addr_lensocklen_t로 선언 ter. 아마도 int을 전달했을 것입니다.

지금과 같이 server_addr_len을 정의

socklen_t server_addr_len; 
+0

'socklen_t server_addr_len;'은 모두 ** 선언과 ** 정의입니다. extern socklen_t server_addr_len;은 단지 선언 일 뿐이다. 'socklen_t server_addr_len = 0;'은 ** 선언과 ** 정의 **와 ** 초기화입니다. @iharob 참조 : http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-declaration – alk

+0

링크를 증명해 주셔서 감사합니다. 하나의 질문이지만 스토리지 클래스와 관련이 있습니까?"자동 저장"의 경우, 'socklen_t server_addr_len;'은 항상 유효한 정의이지만, 'extern'의 경우 항상 그렇진 않을 수도 있습니다. " '-fno-common'이 컴파일 타임에 없습니까? –

+1

"선언"은 약속이고, "정의"는 사실입니다. @SouravGhosh – alk

0

는 그냥 recvfrom 함수 서명 이후

socklen_t server_addr_len; 

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, 
     struct sockaddr *src_addr, socklen_t *addrlen); 
+0

답장을 보내 주셔서 감사합니다. 그러나 gcc 컴파일러는 이것을 컴파일 할 수 없습니다. – staigoun

+0

왜 안 되니? 지금 어떤 오류가 있습니까? –

+0

'error : 비 스칼라 타입으로의 변환이 요구되었습니다 .' – staigoun

1

recvfrom()man page를 참조하십시오. 그것은 말한다

는 함수 프로토 타입은 제 6 회 인수가 socklen_t *addrlen입니다

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, 
      struct sockaddr *src_addr, socklen_t *addrlen); 

입니다. 따라서, 응용 프로그램에서 recvfrom()를 호출하는 동안, 당신은

socklen_t server_addr_len = 0; 
struct sockaddr * remote_addr = NULL; 
ssize_t retval = 0; 
. 
. 
retval = recvfrom(server_socket, inputbuffer, maxLenght, 0, remote_addr, &server_addr_len); 

SideNotes처럼 사용할 수있다 : 그들은 cast ING 필요하지 않도록

1. 방식으로 변수를 정의합니다. 좋은 연습. 2. 성공을 위해 recvfrom() [ar의 경우 ar, 모든 라이브러리 호출]의 반환 값을 확인하십시오.

+0

@iharob 예 차이가 있습니다. 왜 _declare_라고 말하면서 왜 여기에 _define_ term을 사용하지 않겠습니까? 제발 좀 더 자세히 설명해 주실 수 있습니까? 고맙습니다. –

+0

'usigned int'만이 내 컴파일러를 행복하게 만듭니다. – staigoun

+0

@ iharob 그래, 맞아.하지만 보통 변수를 초기화하는 것이 더 나은 방법이다. 결합하면 정의가됩니다. :-) –