0

上一个问题的答案: https ://stackoverflow.com/a/2035683/960086 没有检查并安静下来,所以我错过了。已经要求在此处发布

我正在玩一个在子进程上创建套接字连接的应用程序。

现在我的问题是尝试对其进行测试,但是每次运行应用程序时,Netbeans 都会在我通过单击红色方块或右下角的 main(run) X 按钮关闭时创建 main(Build, Run) 和 main(Run)。进程“终止”但它停留在那里,然后在退出 IDE 时显示“退出 IDE 将终止...”main(run)”

这是我第一次使用 fork(和 c),所以我想我在终止主进程时没有终止子进程,但我不应该也可以手动终止吗?或者有没有办法让我有一个不断监听而不阻塞其余代码的套接字连接?

(注意连接不正确,因为它仍然有阻塞)

connection()
...
connection() {
    int pid = fork();
if (pid < 0)
    {
        perror("ERROR on fork");
    exit(1);
    }
if (pid == 0)  
    {
    int sockfd, portno, n;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    fd_set fds;
    struct timeval timeout;
    int rc;
    /* Set time limit. */
    timeout.tv_sec = 0;
    timeout.tv_usec = 10;
    char buffer[256];

    portno = 4444;
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if (sockfd < 0) 
        error("ERROR opening socket");
    server = gethostbyname("Localhost");
    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);
    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR connecting");
    while(1)    {
        /* Create a descriptor set containing our two sockets.  */
        FD_ZERO(&fds);
        FD_SET(sockfd, &fds);
        rc = select(sizeof(fds)*8, &fds, NULL, NULL, &timeout);
        if (rc==-1) {
            perror("select failed");
        }
        if (rc > 0) {
            bzero(buffer,256);
            fgets(buffer,255,stdin);
            n = write(sockfd,buffer,strlen(buffer));
            if (n < 0) 
                 error("ERROR writing to socket");
        }
        rc = select(sizeof(fds)*8, &fds, NULL, NULL, &timeout);
        if (rc==-1) {
            perror("select failed");
        }
        if (rc > 0) {
            bzero(buffer,256);
            n = read(sockfd,buffer,255);
            if (n < 0) 
                 error("ERROR reading from socket");
            printf("Client: Server send %s",buffer);
            useEvent(buffer);
        }
    }
}
4

0 回答 0