首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-04-15 
Linux C 网络编程急~~~~~~~~~~~~~~~~~~用多线程实现的的一个多人聊天室....用数组储存用户struct user{int

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++;        }    }}



[解决办法]


帮你顶下,挺简单的,也挺复杂的
[解决办法]
用gdb
的watch命令
[解决办法]
review你的代码,认为你的代码是完全错的, 找到BUG后推倒重写。
[解决办法]
user_count 
在accept后马上自增,不要在后面才自增。
[解决办法]
(第一个用户的socket_fd就变成6了)
你可能是逻辑哪里错了,第二个socket_fd=6
查查的socketfd赋值错了,还是fork的时候有问题
[解决办法]

探讨
还没人啊?

[解决办法]
在client_handle这个线程还未处理user_count++时,可能会有别的client连接进来,这样在accept时usr_array[user_count+1]中的user_count还并未加1,覆盖了原来的socket_fd.

[解决办法]
我检查了一下,第一个用户进来的时候usr[user_count].socket_fd=5 这是正常的吧..
第二个用户一进来 第一个用户的socket_fd就变成6了,而第二个用户的socket_fd=0...

更具你的描述和代码,推测为:

在第一个用户accept并printf出fd 和 程序运行到user_count++;之间,第二个用户连了上来,此时user_count的值还没加1,到时accept的值又赋给了第一个元素。所以你的第一个用户变成了6,而第二个还是0(全局变量初始化为0)

accept后就可以user_count++了。但这要还是不保险。你该把client_handle所需的fd当参数传入,而不是用全局变量。

热点排行