1

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");
}
4

1 に答える 1

2

まず、初心者の C プログラマーの常習的なエラー: を使用sizeofしてポインターのサイズを取得しています。変数pazBufferは配列ではなくポインタであるため、sizeof演算子は必要な配列の長さを返しません。関数は、別のパラメーターとしてIPCSendの長さを受け取る必要があります。pazBuffer

void IPCSend(char *pazClientAddress, int iClientPort, char *pazBuffer, size_t len)


発生しているエラーについては、他の何かに関連している可能性があります。Invalid argument渡したパラメーターの 1 つsendtoが何らかの形で無効であることを意味します。ソケット記述子を適切に初期化していることがわかったので、問題は送信バッファが何らかの形で無効である可能性があります-おそらくnullポインタまたは不正なアドレスです。これは、投稿したコードからは問題が明らかではなく、IPCSend.

于 2012-04-10T13:03:06.590 に答える