簡體   English   中英

UDP C服務器sendto()錯誤:無法分配請求的地址

[英]UDP C Server sendto() error: Can't assign requested address

我正在使用UDP使用C編寫基本的客戶端/服務器程序。 該程序的思想是,客戶端將消息發送到服務器,服務器接收該消息,然后將其回顯給客戶端(目標是測量UDP的RTT)。 不幸的是,在服務器端,當程序嘗試調用sendto()以回顯消息時,我收到錯誤消息“無法分配請求的地址”。

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <fcntl.h>

#define SERVER_PORT 7000 
#define MAX_PENDING 10 
#define MAX_LINE 1024000

int main() 
{ 
    struct sockaddr_in sin, sout;
    socklen_t soutLen; 
    char buf[MAX_LINE]; 
    int len;
    int msgLen;
    int s; 
    char *msg;
    if( (s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){
        perror("could not establish UDP socket");
        exit(1);
    }

    /* build address data structure */ 
    bzero((char *)& sin, sizeof( sin)); 
    sin.sin_family = AF_INET; 
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons(SERVER_PORT);

    if( (bind(s, (struct sockaddr *)&sin, sizeof(sin))) < 0){
        perror("udpServer: bind"); 
        exit( 1); 
    }

    while(1){
        if((msgLen = recvfrom(s, buf, sizeof(buf), 0,(struct sockaddr *)&sout, &soutLen))<0){
            perror("udpServer: recvfrom()"); 
            exit( 1); 
        }

        if( (sendto(s, buf, msgLen, 0, (struct sockaddr *)&sout, sizeof(sout)))<0 ){
            perror("udpServer: sendto()"); 
            exit( 1); 
        }
        free(msg);
    }

} 

在此先感謝您:我是C語言的新手,因此非常感謝您提供任何建議!

問題是,你sout傳遞給sendto是不正確的,因為你沒有正確設置它的大小將它傳遞給當recvfrom

收錄人:

  ssize_t recvfrom(int socket, void *restrict buffer, size_t length, int flags, struct sockaddr *restrict address, socklen_t *restrict address_len); 

如果address不是空指針,並且套接字不是面向連接的,則填充消息的源地址。address_len參數是一個value-result參數,初始化為與address關聯的緩沖區的大小,並在返回以指示存儲在其中的地址的實際大小。

當將&sout傳遞給recvfrom ,還必須告訴recvfrom您要傳入的結構的大小,以便它知道可以在其中寫入多少數據soutLen既是in參數又是out參數。 由於您沒有初始化soutLen ,它的值可能小於結構的實際大小,這意味着您在sout中得到的結果無效。

因此,您需要初始化soutLen

struct sockaddr_in sin, sout;
socklen_t soutLen = sizeof(sout); 

那么你應該通過這個值的大小來sendto而不是sizeouf(sout) (這可能並不需要,但它是很好的做法):

   if( (sendto(s, buf, msgLen, 0, (struct sockaddr *)&sout, soutLen))<0 ){

同樣,請注意,您正在釋放從未分配的msg 這無關緊要,但稍后可能會引起問題。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM