저는 UDP 소켓을 처음 사용하기 때문에 이전에 TCP로 작업했습니다. 내 클라이언트가 내 서버에 연결할 수없는 것 같지만 문제가 어디에 있는지 알 수 없습니다.UDP 소켓 (DGRAM) 바인드/sendto 오류
내 서버를 실행하면 정상적으로 작동하는 것 같습니다. 컴파일없이 문제없이 실행하고 클라이언트의 메시지를 기다립니다.
반면 클라이언트가 문제없이 컴파일되지만 런타임에 bind()에서 오류가 발생합니다. 나는 다른 곳에서 바인드가 항상 필요하지 않기 때문에 내가 그것을 제거하려고 시도했음을 보았습니다. 그러나 이것을 할 때 sendto()에 에러가 나타납니다. 문제를 찾으려고 perror()를 사용합니다. 바인드에서 메시지는 "Address already in use"이고 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;
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);
}
"이미 사용중인 주소"일반적으로 사용하려는 포트가 이미 사용된다는 것을 의미한다 :
또한 sendto를()로 인수가 잘못 보면,으로 정의된다. –
이러한 우드 서버 및 클라이언트의 예를 살펴보십시오. http://www.cs.ucsb.edu/~almeroth/classes/W01.176B/hw2/examples/udp-server.c 및 http : // www. cs.ucsb.edu/~almeroth/classes/W01.176B/hw2/examples/udp-client.c –
@ Gaetano 덕분에, 예제가 실제로 나를 도왔습니다 – aponcedeleonch