I am trying to send a buffer via UDP sockets in C but I always get an invalid argument error in sendto. I just don’t find the error. Could anyone maybe help me. Thanks in advance.
Here’s my code:
/**/ void IPCSend(char *pazClientAddress, int iClientPort, char *pazBuffer )
{
int iSocket;
/* */
if ((iSocket = socket(AF_INET, SOCK_DGRAM, 0)) != -1)
{
int iSendToReturn;
struct sockaddr_in sinServerAddress;
struct hostent *pstHost;
/* */
pstHost = (struct hostent *)gethostbyname((char *)pazClientAddress);
/* */
sinServerAddress.sin_family = AF_INET;
sinServerAddress.sin_addr = *((struct in_addr *)pstHost->h_addr);
sinServerAddress.sin_port = iPortNumber;
bzero(&(sinServerAddress.sin_zero),8);
/* */
fprintf(stdout,"sending '%s' to client '%s:%d'\n",pazBuffer,pazClientAddress,iClientPort);
iSendToReturn = sendto(iSocket, pazBuffer, sizeof(pazBuffer), 0, (struct sockaddr *)&sinServerAddress, sizeof(sinServerAddress));
/* */
if(iSendToReturn != -1)
fprintf(stdout,"%d bytes sent\n",iSendToReturn);
else
perror("SendTo");
/* */
close(iSocket);
}
else
fprintf(stdout,"could not connect to server\n");
}
Firstly, you’re making the perennial error of novice C programmers: using
sizeofto get the size of a pointer. The variablepazBufferis a pointer, not an array, so thesizeofoperator will not return the array length, which is what you want. YourIPCSendfunction needs to take in the length ofpazBufferas a separate parameter:As for the error you’re getting – it might be related to something else.
Invalid argumentmeans that one of the parameters you’re passing tosendtois somehow invalid. Since I see that you are properly initializing the socket descriptor, the problem might be that the send buffer is somehow not valid – possibly a null pointer or bad address. This means that the problem is not apparent from the code you posted, and is likely in some code that is callingIPCSend.