我试图在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");
}发布于 2012-04-10 21:03:07
首先,您正在犯C程序员新手经常犯的错误:使用sizeof获取指针的大小。变量pazBuffer是一个指针,而不是数组,所以sizeof运算符不会返回您想要的数组长度。您的IPCSend函数需要将pazBuffer的长度作为一个单独的参数:
void IPCSend(char *pazClientAddress, int iClientPort, char *pazBuffer, size_t len)至于你得到的错误--它可能与其他东西有关。Invalid argument意味着你传递给sendto的一个参数是无效的。由于我看到您正确地初始化了套接字描述符,因此问题可能是发送缓冲区以某种方式无效-可能是空指针或错误地址。这意味着问题在您发布的代码中并不明显,并且可能存在于调用IPCSend的某些代码中。
https://stackoverflow.com/questions/10089288
复制相似问题