块插座Unix和C / C ++帮助 [英] Block Socket with Unix and C/C++ Help

查看:132
本文介绍了块插座Unix和C / C ++帮助的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图找出是什么挡住了我的计划。我在运行使用POSIX线程的服务器。我得为我的计算机编程实验室。主要功能侦听新的连接。一旦它接受一个连接,它创建通过将FD给线程一个新的线程。我能够成功地连接到使用多个Telnet /客户端连接服务器。我可以将数据发送到服务器成功一次,但如果我再次尝试发送服务器将不会做任何事情。

I'm trying to figure out what is blocking my program. I'm running a server that uses POSIX threads. I have to for my computer programming lab. The main function listens for new connections. Once it accepts a connection, it creates a new thread by passing the FD to the thread. I'm able to successfully connect to the server using multiple telnet/client connections. I can send data to the server successfully once, but if I try sending again the server won't do anything.

的主要功能的部分

int active_thread = 0;  
    //The Running loop  
while(running)  
{ 
    if(active_thread > NUMBTHREADS)
    {
        printf("Unable to accept client connection!  Threads are all used up");
        running = false;
    }
    else
    {
        if(FD_ISSET(sockfd, &readfds))
        {
            if((bindfd[active_thread] = accept(sockfd, (struct sockaddr *) &client_addr, &client_sock_size)) == -1)
            {
                fprintf(stderr, "Unable to accept client \n");
                perror("What");
                break;
            }

            activethreads[active_thread] = pthread_create( &threads[active_thread], NULL, server_handler, (void*) &bindfd[active_thread]);
            //close(bindfd[active_thread]);
            //pthread_join( threads[active_thread], NULL);
            active_thread++;
            //running = false;
            }       
        }
    }
    close(sockfd);
    return 0;
}

POSIX线程code部分

Part of the POSIX THREAD CODE

void *server_handler( void *sockfd)  
{  
    int bindfd = *( (int *) sockfd);  
    char buffer[MESSAGELENGTH];  
    bool running = true;  
    printf("Thread was created successfully\n");  
    char intro[] = "Successfully Connected to server!\n";  
    struct pollfd pfd;  
    pfd.fd = bindfd;  
    pfd.events = POLLIN;  

    if ( (send(bindfd, intro, strlen(intro), 0)) < 0)  
    {  
        perror("Unable to send");  
    }  

    while(running){  
    char msg[] = "\nYou have the following options!\n1) Insert an integer:  insert <integer>\n2) Remove An Integer:  remove <integer>\n3) Get number of integers in list: get_count\n4) Get first integer:  get_first\n5) Get last integer:  get_last\n6) Quit program:  quit\n ";  
    if ( (send(bindfd, msg, strlen(msg), 0)) < 0)  
    {  
        perror("Unable to send");  
    }  
    memset(&buffer, 0, MESSAGELENGTH);  
    if (recv(bindfd, buffer, MESSAGELENGTH, 0) > 0)  
    {
        //SOme other code
    }  
}  

我认为它在无论是接受或recv阻塞。我听说过的select()等各种方式,但我有困难,努力实现它们。谢谢!

I think its blocking at either the accept or recv. I've heard of select() and various other methods, but I'm having difficulty trying to implement them. Thanks!

推荐答案

您的问题的根本原因似乎是,你是无条件地执行关闭(的sockfd);返回0; 你的而(运行)循环的底部,这意味着循环只会执行一次。

The root cause of your issue appears to be that you are unconditionally executing close(sockfd); return 0; at the bottom of your while (running) loop, which means that the loop only ever executes once.

此外,你不应该使用 FD_ISSET(),除非你使用了选择()。你的主循环看起来应该更像是:

Additionally, you should not be using FD_ISSET() unless you are also using select(). Your main loop should look something more like:

int active_thread = 0;  

while (active_thread < NUMBTHREADS)  
{ 
    if((bindfd[active_thread] = accept(sockfd, (struct sockaddr *) &client_addr, &client_sock_size)) == -1)
    {
        fprintf(stderr, "Unable to accept client \n");
        perror("What");
        break;
    }

    activethreads[active_thread] = pthread_create( &threads[active_thread], NULL, server_handler, (void*) &bindfd[active_thread]);
    active_thread++;
}

if (active_thread >= NUMBTHREADS)
{
    printf("Unable to accept client connection!  Threads are all used up.\n");
}
running = false;
close(sockfd);
return 0;

这篇关于块插座Unix和C / C ++帮助的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆