2012-03-07 3 views
1

私はクライアント/サーバープログラムとアプレットを持っています。私は以下のコードを表示します。なぜ、どこでプログラムがブロックされているのか、教えてください。アプレットは固執しているようですが、私がCpp側を閉じると、アプレットは実行を終了します。コードを強調します(私は輸入品を除外しています)。Java(またはCpp)ブロッキングどこかで

public class first extends JApplet { 

    PrintWriter toServer = null; 
    BufferedReader fromServer = null; 

    public void init() { 

     System.setProperty("javax.net.ssl.keyStore", "javakeys"); 
     System.setProperty("javax.net.ssl.keyStorePassword", "javakeys"); 

try { 

     SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
     SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", 4000); 

     toServer = new PrintWriter(sslsocket.getOutputStream(), true); 

     InputStreamReader isr = new InputStreamReader(sslsocket.getInputStream()); 
     fromServer = new BufferedReader(isr); 

    } catch (Exception exception) { 
      exception.printStackTrace(); 
    } 

     toServer.println("Flystar".getBytes()); 

    } 

    public void paint(Graphics g) { 

     g.setColor(Color.red); 
     g.drawString("Welcome to Java!!", 50, 60); 
    } 


} 

そして、ここでは、CPPだ...

int conn_new_server(int); 

__attribute__((constructor)) void construct_ssl() 
{ 
    SSL_load_error_strings(); 
    SSL_library_init(); 
    OpenSSL_add_all_algorithms(); 
} 

__attribute__((destructor)) void destruct_ssl() 
{ 
    ERR_free_strings(); 
    EVP_cleanup(); 
} 

int main() 
{ 
    int sockfd, client; 
    SSL_CTX *tlsctx; 
    SSL *ssl; 
    char recvit[256]; 

    printf("Status %d\n", RAND_status()); 
    tlsctx = SSL_CTX_new(TLSv1_server_method()); 
    SSL_CTX_set_options(tlsctx, SSL_OP_SINGLE_DH_USE); 
    SSL_CTX_use_certificate_file(tlsctx, "server.crt" , SSL_FILETYPE_PEM); 
    SSL_CTX_use_PrivateKey_file(tlsctx, "server.key", SSL_FILETYPE_PEM); 

    sockfd = conn_new_server(1337); 
    while (1) 
    { 
     client = accept(sockfd, NULL, NULL); 
     ssl = SSL_new(tlsctx); 
     SSL_set_fd(ssl, client); 
     SSL_accept(ssl); 

     cout << "connection detected!\n\r"; 

     while(1) { 

//   SSL_write(ssl, "hello", sizeof("hello")); 
      SSL_read(ssl, recvit, sizeof(recvit)); 
      cout << recvit << "\n\r"; 
     } 

//  SSL_write(ssl, "Hi :3\n\r", 6); 

     SSL_shutdown(ssl); 
     SSL_free(ssl); 
//  close(client); 
    } 
    SSL_CTX_free(tlsctx); 
// close(sockfd); 

    return 0; 
} 


int conn_new_server(int port) 
{ 
    WSADATA g_wsadata;  // Winsock data holder 
    int err; 
    StartSocketLib; 
    char *messageman = "Hello.\r\n"; 
    int recv_stat; 
    int connsock = 0; 
    char *testsendbuf = "This is very good!\r\n"; 
    list<int> socklist; 

    // BEGIN CODE BLOCK 2.3 - Create a Listening Socket on port 4000 
    int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

    if(sock == -1) { 
     cout << "Socket creation error!" << endl; 
     return 0; 
    } 

    cout << "Socket created! Standing By." << endl; 

// create a sockaddr_in for binding, listening on port 4000 
    struct sockaddr_in socketaddress; 
    socklen_t sa_size = sizeof(struct sockaddr_in); 
    socketaddress.sin_family = AF_INET; 
    socketaddress.sin_port = htons(4000); 
    socketaddress.sin_addr.s_addr = htonl(INADDR_ANY); 
    memset(&(socketaddress.sin_zero), 0, 8); 

    // bind the socket 
    err = bind(sock, (struct sockaddr*)&socketaddress, sa_size); 

    // listen on the socket 
    err = listen(sock, 16); 
+1

私はデバッグとプロファイルコードを学ぶことをお勧めします – pyCthon

+0

トレースを実行しますが、JCreatorはそれを防ぐための奇妙な方法を持っています。私はちょうど誰かがコードのブロッキング部分を指摘することを期待していた – Confident

+0

私はよく分からない: 'int conn_new_servpublicクラスはJAppletを最初に継承します。' 'ですが、確かにC++のようには見えません。 C++/CLI、おそらく? –

答えて

1

ここ数1の問題はBufferedReaderを使用しています。データを返す前に内部バッファを埋めるようにします。バッファを埋めるための十分なデータがない場合はブロックされます。 BufferedReaderを使用してreadLine()メソッドを取得している場合(ここで行っていることです)、次に構築するときには、1という2番目のコンストラクタ引数を渡して、バッファサイズを1文字に設定しますバッファリング。それはおそらくあなたの問題を解決するでしょう。

+0

うん、うまくいきませんでした。しかし、助けてくれてありがとう。私は接続を取得するが、データは何も行き来していない – Confident

関連する問題