[수정]채팅프로그램에 질문이요

먼저 아래의 구조가 제가 생각하는 문제점을 말씀드리며...다른 고수 분 들은 어떤 방법을 사용하는지 여쭈어 볼려구 합니다
목적 먼저 이프로그램의 목적은 11채팅프로그램으로서 채팅목록을 접
속자에게 내려보내주고, 접속자가 상대방을 선택하면, 오직 그 사람과 대
화를 하고, 만약 접속을 끝내면, 다시 채팅목록을 받아오던가 , 아니면 접
속을 종료하려구 합니다.
여기서 제가 생각하는 문제점은
1 select()에서의 버퍼의 크기는 _size(?)<여기에서 select 로 검색해서
읽은 결과 define를 바꾸면 된다구 하더군요>
60000정도를 커버할 수 있는지요?
2 11통신을 위해서 fork를 생각중입니다. 즉 한유저가 상대방을 지정하
고, 상대방이 응대하면 , fork를 하여서 처리하려고 생각중입니다.
그러면 2개의 소켓이 열린 1개의 프로세스로서 처리가 될것으로 생각합
니다. 그런데 ..이 fork가 허용하는 한계치가 얼마나 되는지 궁금합니다
3. 제가 생각한 것은 이런것인데... 제 이런 고민에 조언을 구하고자 합니
다. 네트윀 구조를 잡는데 있어서 어떤 구조가 좋은지에대해...많
은 조언
을 구하고자 합니다. 그럼 아래 소스를 올리며 이만 줄입니다..
#define MAXLINE 1024
#define MAX_SOCK 10000
int getmax(int);
void removeClient(int); /* 채팅 탈퇴 처리 함수 */
int maxfdp1; /* 최대 소켓번호 +1 */
int num_chat = 0; /* 채팅 참가자 수 */
int client_s[MAX_SOCK]; /* 채팅에 참가자 소켓번호 목록 */
int main(){
char rline[MAXLINE], my_msg[MAXLINE];
bind(s,(struct sockaddr *)&server_addr,sizeof(server_addr);
listen(s, 5);
maxfdp1 = s + 1; /* 최대 소켓번호 +1 */
while(1) {
FD_ZERO(&read_fds);
FD_SET(s, &read_fds);
for(i=0; i
maxfdp1 = getmax(s) + 1; /* maxfdp1 재 계산 */
if (select(maxfdp1, &read_fds, (fd_set *)0, (fd_set *)0,(struct
timeval *)0) < 0) {에러;}
client_fd=0; //초기화 해 두고..
if(FD_ISSET(s, &read_fds))
{
clilen = sizeof(client_addr);
client_fd = accept(s, (struct sockaddr *)&client_addr,
&clilen);
if(client_fd == -1) {에러;}
/* 채팅 클라이언트 목록에 추가 */
client_s[num_chat] = client_fd;
num_chat++;
send(client_fd, client_s,strlen(client_s), 0);// 1.전체 접
속자 리스트를 보낸다
printf("%d번째 사용자 추가.\n", num_chat);
}
if(client_fd==0){usleep(10);continue;} //while를 계속 돌기 때문
에 cpu에 과부하(?)를 방지..위해서 sleep사용.
//==>accept되었으면
recv(cient_fd,rline,MAXLINE,0); // Client로 부터 메세지
받고, 내용은 누구(client_s[]리스트중)와 애기하고 싶다.
{ 받은 메세지를 분석해서 clild의 peer에 값을 넘겨줄 fd를 추출
==> clild_peer에 대입 }
rt=fork() 또는 create_thread() 를 사용한다 // 그래도 한계가 있을
텐데..그 한계는 어떻게 알고...10000 개 정도를 커버할려면??
if(rt==0)//clild
{
int peer_fd;
//int peer[2]; // 11 통신만 가능.
peer_fd=clild_peer; //clild라 통화할 상대( 받은 메세지로
부터 추출한값client_s에서)
close(s);
FD_ZERO(&read_fds);
FD_SET(cient_fd, &read_fds);
FD_SET(peer_fd, &read_fds);
while(1)
{
if(FD_ISSET(client_fd, &read_fds))
{
if((n = recv(client_fd, rline, MAXLINE, 0))
<= 0) {
close(client_fd); close(peer_fd);
/* abrupt exit */
send(peer_fd,"연결이 끊겼습니
다",strlen("연결~다"),0);
exit(0);//연결이 끊긴경우 연결을 종
료한다
}
{받은 메세지 처리 & 내려 보낼 데이터 만들고}
send(peer_fd,"만든 데이터",strlen("데이
터"),0);
}
if(FD_ISSET(peer_fd, &read_fds))
{
위와 같은 역활..
}
}/*while*/
}
else if(rt>0)//parents
{
close(client_fd);
close(child_peer);
removeClient(client_fd);
removeClient(child_peer);
continue;
}
}
}
/* 채팅 탈퇴 처리 */
void removeClient(int i) {
close(client_s[i]);
if(i != num_chat-1) client_s[i] = client_s[num_chat-1];
num_chat--;
printf("채팅 참가자 1명 탈퇴. 현재 참가자 수 = %d\n",
num_chat);
}
/* clien_s[] 내의 최대 소켓번호 얻기(초기치는 k) */
int getmax(int k) {
int max = k;
int r;
for (r=0; r < num_chat; r++) {
if (client_s[r] > max ) max = client_s[r];
}
return max;
}
댓글 달기