[問題] 用socket select函式做聊天室的問題!

看板LinuxDev作者時間16年前 (2008/06/24 03:43), 編輯推噓4(405)
留言9則, 4人參與, 最新討論串1/1
我自己測試了很久還是試不出來要怎麼讓三個人可以同時聊天~ 拜託各位幫我看一下程式碼那裡有錯好嗎?謝謝了! server端程式: #include "unp.h" #include <stdio.h> #include <stdlib.h> int total_people; int counter; int i=0; int main(int argc , char **argv) { int listenfd , connfd[i] , clifd[11]; int maxfdp1; fd_set rset; struct sockaddr_in servaddr; char sendline[MAXLINE], recvline[MAXLINE]; socklen_t servlen; ssize_t n; int checkyesno; int j; int countdown=3; listenfd = socket(AF_INET , SOCK_STREAM,0); //creat a listen socket bzero(&servaddr, sizeof(servaddr)); //initial zero servaddr.sin_family = AF_INET; //IPV4 address family servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // universal adderss servaddr.sin_port = htons(SERV_PORT); // short port bind(listenfd , (SA *) & servaddr , sizeof(servaddr) ); //make the servaddr relates to socket listen(listenfd , LISTENQ); // creat a listen socket total_people =0; while( (connfd[i] = Accept(listenfd , (SA *) &servaddr, &servlen) ) > 0) { //Close(listenfd); servlen = sizeof(servaddr); //str_cli(stdin , connfd[i]); total_people++; counter++; printf("\n"); printf("Welcome ! Client%d came in.\n", total_people); sprintf(sendline ,"Welcome ! \n"); //writen(connfd[i], sendline, strlen(sendline)); FD_ZERO(&rset); FD_SET(fileno(stdin), &rset); for(j=0 ; j<strlen(connfd) ; j++){ readline(connfd[i], recvline, MAXLINE) ; writen(connfd[j], sendline, strlen(sendline)); Fputs(recvline , stdout); } FD_SET(connfd[i], &rset); i++; }//while loop for ( ; ; ) { printf("server test\n"); maxfdp1 = max(fileno(stdin), connfd[i]) + 1; select(maxfdp1, &rset, NULL, NULL, NULL); if (FD_ISSET(connfd[i], &rset)) // socket { /* socket is readable */ if (readline(connfd[i], recvline, MAXLINE) == 0) err_quit("str_cli: server terminated prematurely"); Fputs(recvline, stdout); sprintf(sendline ,"server socket\n"); writen(connfd[i], sendline, strlen(sendline)); checkyesno = atoi(recvline); if(checkyesno == 2) { printf("This connection will disconnect after three seconds! \n"); while(countdown >0) { printf("%d second \n" , countdown); countdown--; sleep(1); } printf("disconnect the client %d\n", total_people); } else continue; for(j=0 ; j<strlen(connfd) ; j++) writen(connfd[j], recvline, strlen(recvline)); } //if if (FD_ISSET(fileno(stdin), &rset)) // stdin { /* input is readable */ if (Fgets(sendline, MAXLINE, stdin) == NULL) continue; /* all done */ sprintf(sendline ,"server stdin\n"); for(j=0 ; j<strlen(connfd) ; j++) writen(connfd[j], sendline, strlen(sendline)); } //FD_ZERO(&rset); } total_people = total_people -1; //}// while loop exit(0); Close(connfd[i]); }//main ==================================================== client端程式: #include "unp.h" #include <stdio.h> #include <stdlib.h> int main(int argc , char **argv) { int clisockfd ; struct sockaddr_in cliaddr; int maxfdp1; fd_set rset; char sendline[MAXLINE] , recvline[MAXLINE]; socklen_t clilen; int temp; char *str2; clisockfd = socket(AF_INET , SOCK_STREAM , 0); bzero(&cliaddr , sizeof(cliaddr)); cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons(SERV_PORT); Inet_pton(AF_INET , argv[1] , &cliaddr.sin_addr); Connect(clisockfd , (SA *) &cliaddr , sizeof(cliaddr)); clilen = sizeof(cliaddr); FD_ZERO(&rset); FD_SET(fileno(stdin), &rset); FD_SET(clisockfd, &rset); while(1) { maxfdp1 = max(fileno(stdin), clisockfd) + 1; select(maxfdp1, &rset, NULL, NULL, NULL); if (FD_ISSET(clisockfd, &rset)) { /* socket is readable */ if (readline(clisockfd, recvline, MAXLINE) == 0) err_quit("str_cli: server terminated prematurely"); Fputs(recvline, stdout); sprintf(recvline , "client socket\n"); Writen(clisockfd, recvline, strlen(recvline)); Readline(clisockfd, recvline, MAXLINE); printf("client socket = %s\n" , recvline); } if (FD_ISSET(fileno(stdin), &rset)) { /* input is readable */ if (Fgets(sendline, MAXLINE, stdin) == NULL) return; /* all done */ printf("client stdin\n"); Writen(clisockfd, sendline, strlen(sendline)); } } exit(0); } // main -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.165.169.40

06/24 09:59, , 1F
程式碼貼在網頁上會比較好喔....
06/24 09:59, 1F

06/24 09:59, , 2F
這樣才翻兩頁就囧了
06/24 09:59, 2F

06/24 12:22, , 3F
嗯!不常貼文 所以排版有點亂! 回歸主題,我可以第二個使用
06/24 12:22, 3F

06/24 12:24, , 4F
讓第二個Client傳送資料到server端,但傳第二次server端就
06/24 12:24, 4F

06/24 12:24, , 5F
接不到了,不知問題出在那??
06/24 12:24, 5F

06/24 23:43, , 6F
回歸主題 就是重貼比較好.這樣怎麼trace ?
06/24 23:43, 6F

06/25 18:15, , 7F
06/25 18:15, 7F

06/25 22:45, , 8F
RAFB很讚耶 找的好!
06/25 22:45, 8F

06/26 10:58, , 9F
這..應該是作業7吧...檢查看看是不是Low-water mark的問題?
06/26 10:58, 9F
文章代碼(AID): #18N_psCf (LinuxDev)