我目前正在为学校作业设置 UDP 套接字,但我无法弄清楚如何将 sockaddr 作为参数正确发送到函数中。SendData 的输入参数的定义方式与它们在 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] = ' ';
/* send */
if (sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) &destAddrUdp,sizeof(destAddrUdp)) < 0) {
fprintf(stderr, "Could not send datan");
}
} `
当从 main 调用下面的代码时,它可以工作,但是当从 SendData 调用它时,来自 sendto 的返回值为 -1。
if (sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) &destAddrUdp,sizeof(destAddrUdp)) < 0) {
fprintf(stderr, "Could not send datan");
}
如果程序被编译,我得到警告:从不兼容的指针类型传递"recvfrom"的参数 5。在发送数据中的 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 socketn");
/* 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,"quitn",MAXMSG) != 0){ //if read string == quit, see else
strlength = strlen(buffer);
SCRC = CRC(buffer, strlength-1);
buffer[strlength-1] = SCRC;
buffer[strlength] = ' ';
SendData(sockfd, (struct sockaddr *) &destAddrUdp, buffer);
/*if (sendto(sockfd, buffer, strlength, 0, (struct sockaddr *) &destAddrUdp,sizeof(destAddrUdp)) < 0){
fprintf(stderr, "Could not send datan");}*/
}
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)
返回指针的大小,而不是结构的大小。
您未能在SendData
和main
中考虑不同类型的destAddrUdp
。 对sendto
的正确调用是:
sendto(fileDescriptor, buffer, strlen(buffer), 0,
(struct sockaddr*) destAddrUdp, sizeof(*destAddrUdp)
问题是sizeof(destAddrUdp)
和(struct sockaddr*) &destAddrUdp
。
在你的主要方面,destAddrUdp
是一个struct sockaddr_in
,但是在你的函数中,它是一个sockaddr_in*
,所以你不能平等地使用它们。首先,函数中的sizeof(destAddrUdp)
会给你指针的大小,其次,函数中的&destAddrUdp
会给你一个destAddrUdp**
。那不是你想要的。
试试sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) destAddrUdp,sizeof(*destAddrUdp))