2014-02-21 1 views
-1
int acceptSocket; 
struct sockaddr_in addr, client, dest; 
char buf[256]; 
long rc, sentbytes; 
int port = 18017; 

int CreateSocket() 
{ 



    if(rc!=0) 

     { 

     printf("socket failure code: %ld\n",rc); 

     return 1; 

     } 

     else 

     { 

     printf("socket started!\n"); 

     } 

     // Socket creation for UDP 

     acceptSocket=socket(AF_INET,SOCK_DGRAM,0); 

     if(acceptSocket==-1) 

     { 

     printf("Failure: socket creation is failed, failure code\n"); 

     return 1; 

     } 

     else 

     { 

     printf("Socket started!\n"); 

     } 

    memset(&addr, 0, sizeof(addr)); 

    addr.sin_family=AF_INET; 

    addr.sin_port=htons(port); 

    addr.sin_addr.s_addr=htonl(INADDR_ANY); 

    rc=bind(acceptSocket,(struct sockaddr*)&addr,sizeof(addr)); 

    if(rc==-1) 

    { 

     printf("Failure: listen, failure code:\n"); 

     return 1; 

    } 

    else 

    { 

     printf("Socket an port %d \n",port); 

    } 




     while(rc!=-1) 
     { 
     rc=recvfrom(acceptSocket,buf, 256, 0, (struct sockaddr*) &client, sizeof(client)); 
     if(rc==0) 
     { 
      printf("Server has no connection..\n"); 
      break; 
     } 
     if(rc==-1) 
     { 
      printf("failure: recv, failure code\n"); 
      break; 
     } 
     XcpIp_RxCallback((uint16) rc, (uint8*) buf, (uint16) port); 


      makeTimer("First Timer", &firstTimerID, 2, 2); //2ms 
      makeTimer("Second Timer", &secondTimerID, 10, 10); //10ms 
      makeTimer("Third Timer", &thirdTimerID, 100, 100); //100ms 

    // buf[rc]='\0'; 
    // printf("Client sendet: %s\n",buf); 
    // sprintf(buf2,"Du mich auch %s",buf); 
    // rc=sendto(connectedSocket,buf2,strlen(buf2),0); 

     } 


     close(acceptSocket); 



     return 0; 

    } 

udp 레이어 용 소켓을 만들었으며 클라이언트와의 연결을 기다리고 나중에 클라이언트에 데이터를 보냅니다. 내 프로그램이 듣기 모드에서 충돌합니다. 예 : 바인딩 후 : 오류가 발생했습니다.C 소켓 프로그래밍에 오류가 있습니까?

printf("Failure: listen, failure code:\n"); 

누구에게 말해 줄 수 있습니까? @ JoachimPileborg : 작동하지 않습니다 !! 다시 같은 문제. 나는 거기에서 논평 할 수 없다. 모든

+1

을 다음과 같이 마십시오 모두 -10rc을 비교할 필요가 없습니다처럼 적절한 형식으로 당신에게 while...loop를 업데이트하십시오 ['errno'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html)의 값을 출력합니다. ['strerror'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/strerror.html)를 호출하여 오류 코드에서 인쇄 가능한 문자열을 얻을 수 있습니다. 오류 코드 (및 문자열)를 포함하도록 질문을 편집하십시오. –

+0

UDP가 연결을 수행하지 않습니다. –

+0

키보드의 Enter 키에 문제가 있습니다. –

답변

0

첫째는, -1이 반환되고, errno는 적당한 값으로 설정된다 바인드 man 페이지 오류에

으로

을 다음과 같이 error.you 할 수있는 실제 찾아야합니다.

모든 POSIX 호출의 표준 절차에는 실제 오류 값이 들어있는 errno라는 정수가 있습니다. 당신은

if (rc == -1) 
{ 
    perror("socket error"); 
} 

#include<errno.h>

이제 바인딩이 있어야합니다 수동으로 값을 확인하거나 perror 또는 strerror는 같은 프리미티브를 사용하거나 할 수는 아마 다른 응용 프로그램이 해당에서 수신

같은 그것의 많은 이유 중 하나가 실패 포트. 당신은 당신이 다음 다른 포트 번호로 전환하거나 해당 포트를 사용하는 프로세스를 종료 사용중인 포트를 발견 그렇다면

netstat -a | grep "18017" 

을 실행하여이를 찾을 수 있습니다.

또한 오류를 얻을 때, 당신이 실제로 * * 오류에 의해 무엇을 볼 수

while(1) 
    { 
     //try to receive some data, this is a blocking call 
     if ((rc = recvfrom(acceptSocket, buf, 256, 0, (struct sockaddr *) &client, &client)) == -1) // read datagram from server socket 
     { 
      break; 
     } 
     //rest of your code 
    } 
+0

포트 번호에 문제가 있습니다. – user3252048

+0

클라이언트로부터 요청을받는다면 수신 실패입니다. 왜 그렇게? – user3252048

+0

@ user3252048 업데이트 된 게시물을 확인하십시오. –