从C客户端向Java服务器发送一个整数

时间:2013-05-03 15:17:38

标签: java c sockets

我使用此代码从我的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.socketWrite0(Native Method)at   java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)     在java.net.SocketOutputStream.write(SocketOutputStream.java:115)at   java.io.DataOutputStream.writeInt(DataOutputStream.java:182)at at   ServiceRequest.run(ServiceRequest.java:36)at   java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:439)     at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:303)

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

1 个答案:

答案 0 :(得分:2)

在这个陈述中,有两件事突然出现在我身上......

write(to_server_socket,"4",4);

1)“4”不是一个整数,它是一个空终止的字符串(好吧,好吧,它是一个整数,但它并不是你所说的“意思”让我想到的)

2)您正在以host-byte-order发送值,该值可能与network-byte-order相同或不同

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()ntohl()而不是htons()ntohs()整数转换。