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;
------解决方案--------------------
用多线程实现的的一个多人聊天室....
用数组储存用户
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++; } } }
------解决方案--------------------