-1

Java サーバーから C クライアントに整数と文字列を送信したいと考えています。整数は読み取れますが、文字列の読み取りに問題があります。これはJavaの私のサーバーコードです

ClientNumber++;
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//dos.flush();
dos.writeInt(ClientNumber);

String randomString= getRandomValue(10,20);
dos.writeUTF(randomString);

これは C クライアント コードです。

int to_server_socket = -1;

void main ( void )
{

    char *server_name = SERVEURNAME;
    struct sockaddr_in serverSockAddr;
    struct hostent *serverHostEnt;
    long hostAddr;
    long status;
    char buffer[512];

    bzero(&serverSockAddr,sizeof(serverSockAddr));
    hostAddr = inet_addr(SERVEURNAME);
    if ( (long)hostAddr != (long)-1)
        bcopy(&hostAddr,&serverSockAddr.sin_addr,sizeof(hostAddr));
    else
    {
        serverHostEnt = gethostbyname(SERVEURNAME);
        if (serverHostEnt == NULL)
        {
            printf("gethost rate\n");
            exit(0);
        }
        bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length);
    }
    serverSockAddr.sin_port = htons(8071);
    serverSockAddr.sin_family = AF_INET;

    /* creation de la socket */
    if ( (to_server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
        printf("creation socket client ratee\n");
        exit(0);
    }
    /* requete de connexion */
    if(connect( to_server_socket,
               (struct sockaddr *)&serverSockAddr,
               sizeof(serverSockAddr)) < 0 )
    {
        printf("demande de connection ratee\n");
        exit(0);
    }
    /* envoie de donne et reception */

    int value = htonl( 6 );
    int reply = 0;

    if( send( to_server_socket, &value, sizeof( value ), 0 ) != sizeof( value ) )
    {
        printf( "socket write failed");
        exit( -1 );
    }

    if( recv( to_server_socket, &reply, sizeof( reply ), MSG_WAITALL ) != sizeof( reply ) )
    {
        printf( "socket read failed");
        exit( -1 );
    }

    printf( "got reply: %d\n", ntohl( reply ) );

    char myString[30] = "";
    ssize_t nbytes=0;

    if ((nbytes = recv(to_server_socket, myString, sizeof(myString), 0 )) < 0)
    {
        perror("recv");
        exit(1);
    }
    myString[nbytes - 1] = '\0';


    printf("Recived String : %s",myString);


}

その結果、自分の番号を取得し、「ソケットの読み取り文字列に失敗しました」というメッセージが表示されました。テストもしないと結果が出ない

char myString[20] = "";
    recv( to_server_socket, &myString, sizeof( myString), 0 );
4

1 に答える 1

0

問題は次の行にあります。

 char myString[30] = "";

 if( recv( to_server_socket, &myString, sizeof( myString), 0 ) != sizeof( myString ))

Java から送信している文字列が 30 文字であると確信していますか。上記の行では、recv の戻り値をチェックして、値が 30 であるかどうかを確認していますが、そうでない場合もあります。

recv の戻り値を出力して、データを取得するかどうか、およびそのデータに含まれる文字数を確認するだけです。

于 2013-05-04T12:12:12.157 に答える