Linux C 网络编程 急该如何解决

Linux C 网络编程 急~~~~~~~~~~~~~~~~~~
用多线程实现的的一个多人聊天室....
用数组储存用户
struct user
{
int id;
char name[USER_NAME_LEN];
char password[USER_PASS_LEN];
char *p_chatlog;
struct sockaddr user_addr;
int socket_fd;
};...
server创建了一个监听进程一直accept...
运行时错误:一个用户登录可以完美操作,程序没任何问题 但是当第二个用户进来 马上server就报recv:socket operation on non-socket...
我检查了一下,第一个用户进来的时候usr[user_count].socket_fd=5 这是正常的吧..
第二个用户一进来 第一个用户的socket_fd就变成6了,而第二个用户的socket_fd=0...
就像请问一下是什么原因造成的...
这是我的毕业设计,蛋疼死了...纠结了几天了..
下面是几个相关的函数... 还有 我user_count开始是-1;
另外里面com_打头的方法是我简单封装了一下的,跟原方法没什么区别的..
全局变量:
struct sockaddr_in server_addr;
pthread_t listening_thread;
pthread_t client_thread[MAX_USER_CONN];
struct user usr_array[MAX_USER_CONN];
struct user usr_list[MAXSIZE];
int user_list_count;
int server_fd;
int user_count=-1;

C/C++ code

int judge_client_action()
{
    int receive_bytes;
    struct message flag_msg;
    bzero(&flag_msg,MSG_LEN);
    printf("usr.socket_fd:%d",usr_array[user_count+1].socket_fd);
    receive_bytes=com_recv(usr_array[user_count+1].socket_fd,&flag_msg,MSG_LEN,0);
    flag_msg.content[receive_bytes]='\0';
    switch(flag_msg.flag)
    {
        case 2 : user_login(flag_msg);
                break;
        case 3 : user_regist(flag_msg);
                break;
        default: login_regist_error();
                break;
    }
}

void pthread_listen()
{
    printf("[INFO]Listening Thread is Strating...\n");
    while(1)
    {
        if(listen(server_fd,BACKLOG)==-1) 
        {
            perror("[ERROR INFO]listen");
            com_exit(1);
        }

        socklen_t sin_size=sizeof(struct sockaddr_in);
        
        if((usr_array[user_count+1].socket_fd=accept(server_fd,(struct sockaddr*) &usr_array[user_count+1].user_addr,&sin_size))==-1)
        {
            perror("[ERROR INFO]socket");
            com_exit(1);
        } 
        printf("usr_array[user_count+1].socket_fd:%d\n",usr_array[user_count+1].socket_fd);
        printf("[INFO]Some One Connected...\n");
        
        if(pthread_create(&client_thread[user_count+1],NULL,(void *)client_handle,NULL)!=0)
        {
        perror("pthread_create listening_thread");
        exit(1);
        }
    }
}

void client_handle()
{
    judge_client_action();
    user_count++;
    struct message msg;
    printf("break point\n");
    strcpy(msg.content,"[INFO]You Are Connected,It's Server's Feed Back...\n");
    com_send(usr_array[user_count].socket_fd,&msg,MSG_LEN,0);
    printf("[INFO]Current User Count:%d\n",user_count+1);
    receive_msg((struct user)usr_array[user_count]);
}


void receive_msg(struct user r_usr)
{
while(1)
{
    int receive_bytes;
    struct message msg;
    receive_bytes=com_recv(r_usr.socket_fd,&msg,MSG_LEN,0);
    msg.content[receive_bytes]='\0';
    int i=0;
    while(i<=user_count)//send client to client
    {
        com_send(usr_array[i].socket_fd,&msg,MSG_LEN,0);
        i++;
    }
}
}

int main()
{
    socket_init();
    init_user_list();
    if((pthread_create(&listening_thread,NULL,(void *)pthread_listen,NULL))!=0)
    {
        perror("pthread_create listening_thread");
        exit(1);
    }
    //sleep(1);
    printf("[INFO]Current User Count:%d\n",user_count+1);
    while(1)//listening the server message to client
    {
        char send_msg[MAXSIZE];
        scanf("%s",send_msg);
        struct message msg;
        strcpy(msg.content,send_msg);
        int i=0;
        while(i<=user_count)
        {
            com_send(usr_array[i].socket_fd,&msg,MSG_LEN,0);
            i++;
        }
    }
}






------解决方案--------------------