C sockaddr函数调用sendto?

我目前正在为学校设置一个UDP套接字,但我不知道如何正确地将sockaddr作为参数发送到函数中。 SendData的input参数的定义方式与sendto函数中的相同。

void SendData(int fileDescriptor, const struct sockaddr_in *destAddrUdp, unsigned char buffer[MAXMSG]) { /* crc */ int strlength = strlen(buffer); unsigned char SCRC = CRC(buffer, strlength-1); buffer[strlength-1] = SCRC; buffer[strlength] = '\0'; /* send */ if (sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) &destAddrUdp,sizeof(destAddrUdp)) < 0) { fprintf(stderr, "Could not send data\n"); } } ` 

当从main调用下面的代码时,它将起作用,但是当从SendData调用sendto时,返回值是-1。

 if (sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) &destAddrUdp,sizeof(destAddrUdp)) < 0) { fprintf(stderr, "Could not send data\n"); } 

如果程序被编译,我得到警告:从不兼容的指针types传递参数5'recvfrom'。 在SendData中的sendto函数调用。 在我的主程序中调用SendData的函数是: SendData(sockfd, (struct sockaddr *) &destAddrUdp, buffer);

主要程序在相关的情况下:

 unsigned char SCRC; unsigned char strlength; unsigned char buffer[MAXMSG-5]; unsigned char header[MAXMSG]; struct rtp_struct *sendstruct; /* option 2 */ struct sockaddr_in destAddrUdp; int sockfd; char dstHost[15]; printf("input host IP:\n>"); fgets(dstHost, 15, stdin); /* Create socket */ if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) fprintf(stderr, "Can't create UDP socket\n"); /* set configurations */ memset (&destAddrUdp, 0, sizeof(destAddrUdp)); //set zero destAddrUdp.sin_family = AF_INET; //internet use destAddrUdp.sin_addr.s_addr = inet_addr(dstHost); //set so anyone can connect destAddrUdp.sin_port = htons(dstUdpPort); //set the port to use /* Generate CRC table */ GenerateCRCTable(); /* get string and send */ while(1) { printf("\n>"); fgets(buffer, MAXMSG, stdin); if(strncmp(buffer,"quit\n",MAXMSG) != 0){ //if read string == quit, see else strlength = strlen(buffer); SCRC = CRC(buffer, strlength-1); buffer[strlength-1] = SCRC; buffer[strlength] = '\0'; SendData(sockfd, (struct sockaddr *) &destAddrUdp, buffer); /*if (sendto(sockfd, buffer, strlength, 0, (struct sockaddr *) &destAddrUdp,sizeof(destAddrUdp)) < 0){ fprintf(stderr, "Could not send data\n");}*/ } else { close(sockfd); exit(EXIT_SUCCESS); } } } 

在你的SendData函数中,参数destAddrUdp类型为const struct sockaddr_in * 。 当你再打这个电话:

 sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) &destAddrUdp, sizeof(destAddrUdp) 

表达式&destAddrUdp类型是const struct sockaddr_in ** ,所以指针类型是不兼容的。 此外, sizeof(destAddrUdp)正在返回一个指针的大小,而不是结构的大小。

您无法解释SendDatamaindestAddrUdp的不同类型。 sendto的正确调用是:

 sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) destAddrUdp, sizeof(*destAddrUdp) 

问题是sizeof(destAddrUdp)(struct sockaddr*) &destAddrUdp

在你的main中, destAddrUdp是一个struct sockaddr_in ,在你的函数中,它是一个sockaddr_in*所以你不能一视同仁。 首先, sizeof(destAddrUdp)在你的函数中会给你一个指针的大小,第二, &destAddrUdp在你的函数中会给你一个destAddrUdp** 。 那不是你想要的。

尝试sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) destAddrUdp,sizeof(*destAddrUdp))