2012-05-30 32 views
0
struct sockaddr_in addrSenderOfVideo 
    struct sockaddr_in client_addr;  // Client Internet address 
    char* buffer = new char[2]; 
    int sizeOfBuffer=1050; 
    int clientfd; 
    char* bufferWithPacketData = new char[sizeOfBuffer]; 
    extern int     client_s;  // Client socket 

    if (client_s < 0) 
      { 
      printf("*** ERROR - socket() failed \n"); 
      } 

      //Client address. 
     client_addr.sin_family = AF_INET; 
     client_addr.sin_addr.s_addr = htonl(INADDR_ANY); // IP address to use 
     client_addr.sin_port = htons(portNumClient); 

    clientfd = bind(client_s,(const sockaddr*) &client_addr, sizeof(client_addr)); 
    fprintf (stderr, "inside of listen for new packet<; clientfd is %d",clientfd); 

     if (clientfd < 0) 
     { 
     fprintf (stderr, "WARNING -1 doing BIND!"); 

     } 


    int n = recvfrom (client_s, bufferWithPacketData, sizeOfBuffer, 0,(struct sockaddr*)&addrSenderOfVideo, &fromlen); 

    retcode = sendto(client_s, buffer, symbol_size, 0, 
      (struct sockaddr *)&addrSenderOfVideo, sizeof(addrSenderOfVideo)); 

當sendto被調用時,錯誤'9errno是不良地址'被打印出來。 這是什麼原因以及如何解決這個問題?發送到sockaddr的'不良地址'*由recvfrom檢索

的數據從在功能recvfrom的發送方接收到的,和addrSenderOfVideo包含一個端口和IP號碼。 發件人擁有IP「127.0.0.1」,這也是包含在addrSenderOfVideo IP地址。

+1

有sendto'的'兩個參數是指向用戶空間緩衝器,因此可以觸發'EFAULT':數據緩衝器和地址。地址指向一個固定大小的局部變量,所以它似乎不是罪魁禍首。所以它一定是數據緩衝區。數據緩衝區指向一個大小爲2的數組。您沒有向我們展示如何初始化'symbol_size'。 symbol_size是否大於2? – Celada

+0

@Celada, 非常感謝!是的,在重複使用代碼時,我犯了忘記使用其他大小而不是'symbol_size'的錯誤。當我改變這個大小時,它現在正在工作。 我一直在尋找放錯了地方的bug ......如果你發表您的評論作爲一個答案,我可以選擇它作爲回答。 –

回答

2

sendto有兩個參數,它們是指向用戶空間緩衝區的指針,因此可以觸發EFAULT:數據緩衝區和地址。地址指向一個固定大小的局部變量,所以它似乎不是罪魁禍首。所以它一定是數據緩衝區。數據緩衝區點大小2的數組你沒告訴我們你如何初始化symbol_size。是symbol_size大於2?