gpt4 book ai didi

Java(或 Cpp)在某处阻塞

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:32 25 4
gpt4 key购买 nike

我有一个客户端/服务器程序和小程序。我将在下面显示代码。您能否告诉我程序阻塞的原因和位置(如果有的话)。小程序似乎坚持但是当我关闭 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 );

最佳答案

这里的第一个问题是使用 BufferedReader。它会在向您返回任何数据之前尝试填充内部缓冲区,如果没有足够的数据来填充缓冲区,它将阻塞。如果您使用 BufferedReader 只是为了获取 readLine() 方法——这就是您在这里所做的——那么当您构造它时,传递第二个构造函数1 的参数,设置一个字符的缓冲区大小,实质上关闭缓冲。这很可能会解决您的问题。

关于Java(或 Cpp)在某处阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9596362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com