我正在尝试通过C中的UDP套接字发送缓冲区,但我总是在sendto中收到无效的参数错误。我只是没有找到错误。任何人都可以帮助我。提前谢谢。
这是我的代码:
/**/ 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");
}
答案 0 :(得分:2)
首先,你是新手C程序员常常犯的错误:用sizeof
来获取指针的大小。变量pazBuffer
是指针,而不是数组,因此sizeof
运算符不会返回数组长度,这就是您想要的。您的IPCSend
函数需要将pazBuffer
的长度作为单独的参数:
void IPCSend(char *pazClientAddress, int iClientPort, char *pazBuffer, size_t len)
至于你得到的错误 - 它可能与其他东西有关。 Invalid argument
表示您传递给sendto
的其中一个参数无效。由于我发现您正在初始化套接字描述符,问题可能是发送缓冲区在某种程度上无效 - 可能是空指针或错误地址。这意味着问题在您发布的代码中并不明显,并且可能在某些调用IPCSend
的代码中。