[問題] 用socket select函式做聊天室的問題!
我自己測試了很久還是試不出來要怎麼讓三個人可以同時聊天~
拜託各位幫我看一下程式碼那裡有錯好嗎?謝謝了!
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
06/24 12:24, 4F
→
06/24 12:24, , 5F
06/24 12:24, 5F
推
06/24 23:43, , 6F
06/24 23:43, 6F
→
06/25 18:15, , 7F
06/25 18:15, 7F
推
06/25 22:45, , 8F
06/25 22:45, 8F
→
06/26 10:58, , 9F
06/26 10:58, 9F
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章