我目前正在为学校作业设置一个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] = '\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");
}如果程序是编译的,我会收到警告:从不兼容的指针类型.中传递SendData中sendto函数调用中的“recvfrom”参数5。我的主程序中对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);
}
}
}发布于 2017-08-25 21:18:05
在SendData函数中,参数destAddrUdp具有const struct sockaddr_in *类型。当你打这个电话时:
sendto(fileDescriptor, buffer, strlen(buffer), 0,
(struct sockaddr*) &destAddrUdp, sizeof(destAddrUdp)表达式&destAddrUdp具有const struct sockaddr_in **类型,因此指针类型不兼容。另外,sizeof(destAddrUdp)返回的是指针的大小,而不是结构的大小。
您未能解释destAddrUdp在SendData和main中的不同类型。对sendto的正确调用是:
sendto(fileDescriptor, buffer, strlen(buffer), 0,
(struct sockaddr*) destAddrUdp, sizeof(*destAddrUdp)发布于 2017-08-25 21:15:39
问题是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))
https://stackoverflow.com/questions/45889436
复制相似问题