C sockaddr вызов функции для sendto?
В настоящее время я настраиваю сокет 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");
}
Если программа скомпилирована, я получаю предупреждение: передача аргумента 5 'recvfrom' из несовместимого типа указателя. на функцию sendto вызывать в SendData. Вызов функции для 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);
}
}
}
2 ответа
В вашем 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)
Проблема заключается в 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))