私はクライアント/サーバープログラムとアプレットを持っています。私は以下のコードを表示します。なぜ、どこでプログラムがブロックされているのか、教えてください。アプレットは固執しているようですが、私が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);
私はデバッグとプロファイルコードを学ぶことをお勧めします – pyCthon
トレースを実行しますが、JCreatorはそれを防ぐための奇妙な方法を持っています。私はちょうど誰かがコードのブロッキング部分を指摘することを期待していた – Confident
私はよく分からない: 'int conn_new_servpublicクラスはJAppletを最初に継承します。' 'ですが、確かにC++のようには見えません。 C++/CLI、おそらく? –