Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C UDP套接字(DGRAM)绑定/发送到错误_C_Sockets_Udp_Bind_Sendto - Fatal编程技术网

C UDP套接字(DGRAM)绑定/发送到错误

C UDP套接字(DGRAM)绑定/发送到错误,c,sockets,udp,bind,sendto,C,Sockets,Udp,Bind,Sendto,我是UDP套接字的新手,以前使用过TCP。我的客户端似乎无法连接到服务器,但我不知道问题出在哪里 当我运行我的服务器时,看起来一切正常。编译和运行时不会出现问题,并等待来自客户端的消息 另一方面,客户端失败,编译时没有问题,但在运行时bind()上出现错误。我在其他地方看到绑定并不总是必要的,所以我也尝试删除它,但当我这样做时,错误会出现在sendto()上。我使用perror()尝试查找问题。在bind中,消息是“地址已在使用”,在sendto中是“协议不支持的地址族” 我不知道我的方法是否错

我是UDP套接字的新手,以前使用过TCP。我的客户端似乎无法连接到服务器,但我不知道问题出在哪里

当我运行我的服务器时,看起来一切正常。编译和运行时不会出现问题,并等待来自客户端的消息

另一方面,客户端失败,编译时没有问题,但在运行时bind()上出现错误。我在其他地方看到绑定并不总是必要的,所以我也尝试删除它,但当我这样做时,错误会出现在sendto()上。我使用perror()尝试查找问题。在bind中,消息是“地址已在使用”,在sendto中是“协议不支持的地址族”

我不知道我的方法是否错了。我试过几种方法,但似乎都不管用。任何帮助都将不胜感激

服务器代码:

int main (){
    int sockfd, newsockfd;
    int portno;
    socklen_t tamcli;
    struct sockaddr_in dest, sa;
    char* mensaje;

    bzero((char *) &dest, sizeof(dest));
    portno = 5001;
    mensaje = (char*)malloc(sizeof(char)*100);

    sockfd = socket(PF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0){
        printf("ERROR al abrir socket\n");
        perror("sockto");
        exit(1);
    }

    dest.sin_family = AF_INET;
    dest.sin_port = htons(portno);
    dest.sin_addr.s_addr = INADDR_ANY;
    tamcli = sizeof(sa);

    if (bind(sockfd, (struct sockaddr *) &dest, sizeof(dest)) < 0){
        printf("ERROR en enlazar\n");
        perror("bind");
        exit(1);
    }


    newsockfd = recvfrom(sockfd, mensaje, sizeof(mensaje), 0,(struct sockaddr *)&sa, &tamcli);
    if (newsockfd < 0){
        printf("ERROR en aceptar el mensaje\n");
        perror("recvfrom");
        exit(1);
    }

    printf("El mensaje del cliente fue: %s\n", mensaje);

    close(sockfd);
}
int main(){
int sockfd,newsockfd;
国际港口;
socklen_t tamcli;
位于南非dest的结构sockaddr_;
char*mensaje;
bzero((char*)和dest,sizeof(dest));
端口号=5001;
mensaje=(char*)malloc(sizeof(char)*100);
sockfd=插座(PF_INET,SOCK_DGRAM,0);
if(sockfd<0){
printf(“错误al abrir套接字\n”);
佩罗尔(“索克托”);
出口(1);
}
dest.sin_family=AF_INET;
目的地sin_港=htons(港号);
dest.sin\u addr.s\u addr=INADDR\u ANY;
tamcli=sizeof(sa);
if(bind(sockfd,(struct sockaddr*)&dest,sizeof(dest))<0){
printf(“错误en enlazar\n”);
佩罗(“绑定”);
出口(1);
}
newsockfd=recvfrom(sockfd,mensaje,sizeof(mensaje),0,(struct sockaddr*)和sa,以及tamcli);
if(newsockfd<0){
printf(“aceptar el mensaje错误”);
perror(“recvfrom”);
出口(1);
}
printf(“客户财富:%s\n”,mensaje);
关闭(sockfd);
}
客户端代码:

int main (){
    int sockfd, newsockfd;
    int portno;
    socklen_t tamcli;
    struct sockaddr_in dest, sa;
    char* mensaje;

    bzero((char *) &dest, sizeof(dest));
    portno = 5001;
    mensaje = (char*)malloc(sizeof(char)*100);
    tamcli = sizeof(sa);

    mensaje = "Hola";

    sockfd = socket(PF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0){
        printf("ERROR al abrir socket\n");
        perror("socket");
        exit(1);
    }

    dest.sin_family = AF_INET;
    dest.sin_port = htons(portno);
    if (inet_aton("127.0.0.1", &dest.sin_addr) == 0){
        printf("Error conectandose a la direccion");
        perror("inet_aton");
        exit(1);
    }

    if (bind(sockfd, (struct sockaddr *) &dest, sizeof(dest)) < 0){
        printf("ERROR en enlazar\n");
        perror("bind");
        exit(1);
    }


    newsockfd = sendto(sockfd, mensaje, sizeof(mensaje), 0, (struct sockaddr *) &sa, tamcli);
    if (newsockfd < 0){
        printf("ERROR en enviar el mensaje\n");
        perror("sendto");
        exit(1);
    }

    close(sockfd);
}
int main(){
int sockfd,newsockfd;
国际港口;
socklen_t tamcli;
位于南非dest的结构sockaddr_;
char*mensaje;
bzero((char*)和dest,sizeof(dest));
端口号=5001;
mensaje=(char*)malloc(sizeof(char)*100);
tamcli=sizeof(sa);
mensaje=“Hola”;
sockfd=插座(PF_INET,SOCK_DGRAM,0);
if(sockfd<0){
printf(“错误al abrir套接字\n”);
佩罗(“插座”);
出口(1);
}
dest.sin_family=AF_INET;
目的地sin_港=htons(港号);
如果(inet_aton(“127.0.0.1”)和dest.sin_addr)=0){
printf(“错误连接到一个目录”);
佩罗尔(“伊内特阿顿”);
出口(1);
}
if(bind(sockfd,(struct sockaddr*)&dest,sizeof(dest))<0){
printf(“错误en enlazar\n”);
佩罗(“绑定”);
出口(1);
}
newsockfd=sendto(sockfd,mensaje,sizeof(mensaje),0,(struct sockaddr*)和sa,tamcli);
if(newsockfd<0){
printf(“环境中的错误”);
perror(“sendto”);
出口(1);
}
关闭(sockfd);
}

您不能在客户端和服务器程序中绑定到同一端口(在同一台机器上)——只有其中一个可以拥有该端点

此外,sendto()的参数看起来也不正确,它的定义如下:

 ssize_t sendto(int s, const void *msg, size_t len, int flags,
                const struct sockaddr *to, socklen_t tolen);

“地址已在使用中”通常表示您尝试使用的端口已被占用。请看这些udp服务器和客户端的示例,@Gaetano谢谢,这些示例非常有用me@Gaetano事实上,我很高兴能帮助朋友,很抱歉我的回答太晚了。。是的,是港口。。我没有填充正确的结构以获得与服务器的连接。。我正在填dest,它必须是sa。。。我改变了它,它工作得很好