gpt4 book ai didi

c - UDP 套接字 (DGRAM) 绑定(bind)/发送到错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:44:38 26 4
gpt4 key购买 nike

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

当我运行我的服务器时,它看起来一切正常。编译运行没有问题,等待客户端消息。

另一方面,客户端失败,编译没有问题,但在运行时在 bind() 上抛出错误。我在其他地方看到绑定(bind)并不总是必要的,所以我也尝试删除它,但是当我这样做时,错误出现在 sendto() 上。我使用 perror() 来尝试定位问题。在 bind 中,消息是“Address already in use”,在 sendto 中是“Address family not supported by protocol”。

不知道我的做法有没有错。我已经尝试了几种方法来做到这一点,但似乎没有任何效果。任何帮助将不胜感激。

服务器代码:

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;
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);
}

最佳答案

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

你的 sendto() 参数看起来也不对,它被定义为:

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

关于c - UDP 套接字 (DGRAM) 绑定(bind)/发送到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25712286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com