使用C客户机和Java服务器时,BufferedReader readLine仍被阻止

使用C客户机和Java服务器时,BufferedReader readLine仍被阻止,java,c,sockets,Java,C,Sockets,我目前正在开发一个C客户机(a),它将与一个Java服务器(B)通信,后者是RMI服务器(C)的客户机。A必须将其参数发送给B,B将把它们发送给C,C将处理它们,将它们重新发送回B,B将它们返回给A。因此,显然A必须写入套接字,然后保持阻塞状态,直到B发送回某些内容。我面临的问题是,在A写入套接字并被select()阻止后,B没有从其自身的读线中解除阻止 如果我从中删除select()和read(),一切都会正常工作。这是密码 A-client.c int err; err =

我目前正在开发一个C客户机(a),它将与一个Java服务器(B)通信,后者是RMI服务器(C)的客户机。A必须将其参数发送给B,B将把它们发送给C,C将处理它们,将它们重新发送回B,B将它们返回给A。因此,显然A必须写入套接字,然后保持阻塞状态,直到B发送回某些内容。我面临的问题是,在A写入套接字并被select()阻止后,B没有从其自身的读线中解除阻止

如果我从中删除select()和read(),一切都会正常工作。这是密码

A-client.c

    int err;
    err = send(sockfd,(const char*)toSend,size,0);//send counter
    if (err < 0){
        perror("Problem encountered while sending");
        exit(3);
    }
    //it always gets past this line
    fd_set read_set;
    int nb;
    FD_ZERO(&read_set); //initialize variables for select
    FD_SET(sockfd, &read_set); 
    nb = select(sockfd+1, &read_set, NULL, NULL, NULL);
    if (nb!=0){
        if (FD_ISSET(sockfd, &read_set)) {//if data is incoming from*/

            char word[4096]="";
            if (read(sockfd, word, 4096) == 0){
                perror("The server terminated prematurely");
                exit(4);
            }   
            for (i=0;i<4096;i++){
                printf("%c",word[i]);
            }
        }
    }
  • 你在读一行,但你在写一行吗?用线路终结者?显然不是

  • 您正在忽略服务器中read()返回的计数。不能假设read()已填充缓冲区

  • 你在读一行,但你在写一行吗?用线路终结者?显然不是

  • 您正在忽略服务器中read()返回的计数。不能假设read()已填充缓冲区


  • 只是想一想,试试
    recv()
    而不是
    read
    。并密切注意返回值,因为它是读取的字节数,或错误为负数。换句话说,它不会返回您正在测试的单个值。注意:需要一些组件。(如中所示,您可能会以块的形式获取数据)。@WhozCraig read()和recv()除了在Windows上是相同的。@EJP在尼克斯上,它们在紧密连接时都显示为0?有趣。谢谢你的提示。(是的,它是我通常使用它们的窗口,Linux上的一些琐碎的东西)。它们在所有方面的行为都是相同的,除了某些标志,比如MSG_PEEK。查看手册页。只是想一想,尝试
    recv()
    而不是
    read
    。并密切注意返回值,因为它是读取的字节数,或错误为负数。换句话说,它不会返回您正在测试的单个值。注意:需要一些组件。(如中所示,您可能会以块的形式获取数据)。@WhozCraig read()和recv()除了在Windows上是相同的。@EJP在尼克斯上,它们在紧密连接时都显示为0?有趣。谢谢你的提示。(是的,它是我通常使用它们的窗口,Linux上的一些琐碎的东西)。它们在所有方面的行为都是相同的,除了某些标志,比如MSG_PEEK。看看手册页,你说得对!我将以\0结束该行,但以\n结束该行可以正常工作。谢谢你,伙计!你说得对!我将以\0结束该行,但以\n结束该行可以正常工作。谢谢你,伙计!
    connection = socket1.accept();
    BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    //it always passes this line
    String str = br.readLine();
    //it passes this line only if i kill the C client or remove the read and select from the client
    String[] splitStr = str.split("\\s+");
    int argsLen = splitStr.length;