2012-01-23 3 views
1

C에서 소켓 프로그래밍에 대한 숙제를 할 때 문제가 있습니다. UDP를 사용하는 간단한 클라이언트/서버 작업을 수행하고 있으며 서버에 문제가 있습니다. 여기에 코드 조각입니다 : C UDP 소켓이 작동하지 않습니다.

int main(int argc, char *argv[]) 
{ 
    int sockfd, newsockfd, portno; 
    socklen_t clilen; 
    char buffer[PACKET_DATA_LENGTH]; 
    struct sockaddr_in serv_addr, cli_addr; 
    int n; 
    if (argc < 2) { 
     fprintf(stderr,"ERROR, no port provided\n"); 
     exit(1); 
    } 
    sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 

는 원래 sockfd = socket(AF_NET, SOCK_DGRAM, 0)SOCK_STREAM했지만, 프로젝트 사양은 TCP UDP에서가 아니라 그것을 할 때부터 DGRAMSTREAM을 변경했습니다.

내가 좋아하는 서버 전화 : ./receiver 1234

을 그리고 오류 얻을 : 나는 DGRAM가 컴파일 ./receiver 1234 잘 작동 STREAM까지 다시 변경하는 경우, 그러나 ERROR on accept: Operation not supported on socket

합니다.

도움 말?

감사합니다. 이 오류가() 모습입니다 편집

-kstruct

void error(const char *msg) 
{ 
    perror(msg); 
    exit(1); 
} 

EDIT2 (이 미리 주어진 코드는, 내가 그것을 기록하지 않았다, 그것은 프로젝트의 일환으로 온) 여기 내 코드 (내가 게시 한 코드의 첫 번째 블록 바로 다음에 오는 것)가 더 많습니다. 상용구 코드가 accept()를 호출하지만 다른 출력 메시지를 트리거해서는 안됩니다. 즉, ERROR on accept이 아닌 ERROR opening socket을 말하면 안됩니까?

bzero((char *) &serv_addr, sizeof(serv_addr)); 
portno = atoi(argv[1]); 
serv_addr.sin_family = AF_INET; 
serv_addr.sin_addr.s_addr = INADDR_ANY; 
serv_addr.sin_port = htons(portno); 
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
     error("ERROR on binding"); 
listen(sockfd,5); 
clilen = sizeof(cli_addr); 
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); 
if (newsockfd < 0) 
    error("ERROR on accept"); 
+0

질문을 이해할 수 없습니다. 당신은 메시지에'ERROR on accept : ...'라고 말한 다음에 * EDIT2 *에서'ERROR opening socket '을 얻었지만'ERROR on accept'라고 예상 할 것입니다. 그게 니가 우리에게 말한거야. –

+0

내 잘못, 다른 방법으로, 나는 그것을 고치겠다. * 수정 * 수정 됨. 나는 나머지 코드를 살펴 보았고 코드에서 다른 accept() 호출은 없다. – adelbertc

+0

데이터 그램 소켓에서'accept()'를 호출하는 것은 유효하지 않습니다. 'accept()'를 아직 호출하지 않았다면 왜 소켓을 여는 데 오류가있을 것이라고 생각합니까? –

답변

5

UDP는 연결되어 있지 않습니다. 왜 accept에 전화를 걸겠습니까?

+0

나는 accept를 명시 적으로 호출하지 않았다. 그것은'sockfd = socket (AF_INET, SOCK_DGRAM, 0)'을 수행 할 때의 부작용 일 것이지만, 클라이언트에서 같은 호출을했기 때문에 오류가 없다 ... – adelbertc

+0

Hrm, 코드를 더 붙여 넣는 것이 좋습니다. 'error()'는 좋은 진단을하기 위해'perror (3)'를 호출합니까? – sarnold

+0

내 코드에 대한 더 많은 것을 게시했습니다. accept()를 분명히 호출합니다 (프로젝트 템플릿과 함께). – adelbertc

0

accept(2)은 UDP와 같은 연결없는 데이터 그램 프로토콜에는 적합하지 않습니다. accept(2)SOCK_STREAMSOCK_SEQPACKET 프로토콜에만 해당됩니다.

connect(2) UDP 프로토콜은 더 많은 필터링을 제공하도록 커널에 요청하지만 항상 바람직한 것은 아닙니다.

관련 문제