0

我使用此代码将整数从我的 Java 客户端发送到我的 Java 服务器

int  n = rand.nextInt(50) + 1;
            DataOutputStream dos = new DataOutputStream(_socket.getOutputStream());
            dos.writeInt(n);

我用这段代码在服务器中读取它

DataInputStream din = new DataInputStream(socket.getInputStream());
        int ClientNumber= din.readInt();
        System.out.println(ClientNumber);


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

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

它工作得很好,但现在我想写一个 C 客户端我试过这段代码

  #include <stdio.h>
#include <errno.h>
#include <signal.h>

#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define SERVEURNAME "localhost" // adresse IP de mon serveur

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 = htons( 4 );
    write( to_server_socket, &value, sizeof( value ) );

    printf(buffer);


}

但它不起作用。我使用 Eclipse 来编译 java 代码并为 C 代码(客户端)运行服务器和 xcode,但我认为问题不存在

编辑:我在服务器上遇到错误

java.net.SocketException:在 java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 在 java.net.SocketOutputStream.write(SocketOutputStream.java:115) 的 java.net.SocketOutputStream.socketWrite0(Native Method) 的管道损坏在 java.io.DataOutputStream.writeInt(DataOutputStream.java:182) 在 ServiceRequest.run(ServiceRequest.java:36) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439) 在 java.util。 concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)

我认为这是因为我的服务器等待一个整数,但它不是......?

4

1 回答 1

2

在这个声明中,有两件事让我很震惊……

write(to_server_socket,"4",4);

1)“4”不是一个整数,它是一个以空结尾的字符串(好吧,它是一个整数,但这不是你“想要”做的)

2)您以主机字节顺序发送值,该值可能与网络字节顺序相同,也可能不同

int value = htons( 4 );
write( to_server_socket, &value, sizeof( value ) );

然而,除此之外,来自 java 的“管道损坏”错误socketWrite()往往表明您的发送端(C 应用程序)已关闭套接字,而您的 java 端仍在尝试写入它。

您的 C 客户端代码正在打开套接字,写入它,然后立即打印一个您从未填充过任何内容的缓冲区并退出程序。一旦程序退出,您为其创建的套接字就会关闭,因此 Java 服务器中的“管道损坏”错误。您需要阅读服务器的回复...

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

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

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

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

在单独的说明中...您表示您在服务器上收到 262144...是在我建议的更改之前还是之后?262144 是 0x00040000 - 所以......你确实得到了 4,只是不是你期望收到它的地方。因此,您使用的是 32 位整数(我应该意识到这一点),这意味着您要使用htonl()andntohl()而不是htons()and ntohs(),它们是短整数转换。

于 2013-05-03T15:29:35.023 回答