2012-05-30 35 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?