Linux C 네트워크 프로 그래 밍 - 다 중 스 레 드 채 팅 방 구현 (클 라 이언 트)

클 라 이언 트 의 주요 기능:
        서버 와 의 연결 을 만 들 고 메 시 지 를 보 내 메 시 지 를 받 습 니 다.
클 라 이언 트 의 코드 구조:
        모두 두 개의 함수 가 있 습 니 다. 하나의 주 함수 (main) 는 클 라 이언 트 소켓 의 초기 화 를 실현 하고 서버 와 연결 을 만 들 며 메 시 지 를 받 아 로 컬 로 표시 합 니 다.콘 솔 에서 정 보 를 읽 고 서버 로 보 내 는 전송 함수 (snd)이 두 함 수 는 각각 두 스 레 드 에서 실 행 됩 니 다. 하 나 는 주 함수 가 있 는 스 레 드 이 고 다른 하 나 는 주 함수 에서 만 든 발송 함수 가 있 는 스 레 드 입 니 다.
구체 적 인 코드 는 다음 과 같다.
(서버 측의 실현:http://blog.csdn.net/smarteryu/article/details/8656259)
#include<time.h>
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>

#define LISTENQ 5
#define MAXLINE 512
#define MAXMEM 10
#define NAMELEN 20

int listenfd,connfd[MAXMEM];//                         

void quit();//       
void rcv_snd(int n);//            

int main()
{
    pthread_t thread;
    struct sockaddr_in servaddr,cliaddr;
    socklen_t len;
    time_t ticks;
    char buff[MAXLINE];

//  socket            
    printf("Socket...
"); listenfd=socket(AF_INET,SOCK_STREAM,0); if(listenfd<0) { printf("Socket created failed.
"); return -1; } // bind printf("Bind...
"); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(6666); servaddr.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0) { printf("Bind failed.
"); return -1; } // listen , // tcp printf("listening...
"); listen(listenfd,LISTENQ); // , ( ) pthread_create(&thread,NULL,(void*)(&quit),NULL); // (-1 ) int i=0; for(i=0;i<MAXMEM;i++) { connfd[i]=-1; } while(1) { len=sizeof(cliaddr); for(i=0;i<MAXMEM;i++) { if(connfd[i]==-1) { break; } } // accept listen connfd[i]=accept(listenfd,(struct sockaddr*)&cliaddr,&len); ticks=time(NULL); sprintf(buff,"% .24s \r
",ctime(&ticks)); printf("%s Connect from: %s,port %d

",buff,inet_ntoa(cliaddr.sin_addr.s_addr),ntohs(cliaddr.sin_port)); // , pthread_create(malloc(sizeof(pthread_t)),NULL,(void*)(&rcv_snd),(void*)i); } return 0; } void quit() { char msg[10]; while(1) { scanf("%s",msg); if(strcmp("quit",msg)==0) { printf("Byebye...
"); close(listenfd); exit(0); } } } void rcv_snd(int n) { char* ask="Your name please:"; char buff[MAXLINE]; char buff1[MAXLINE]; char buff2[MAXLINE]; char name[NAMELEN]; time_t ticks; int i=0; int retval; // write(connfd[n],ask,strlen(ask)); int len; len=read(connfd[n],name,NAMELEN); if(len>0) { name[len]=0; } // strcpy(buff,name); strcat(buff,"\tjoin in\0"); for(i=0;i<MAXMEM;i++) { if(connfd[i]!=-1) { write(connfd[i],buff,strlen(buff)); } } // while(1) { if((len=read(connfd[n],buff1,MAXLINE))>0) { buff1[len]=0; // “bye” , if(strcmp("bye",buff)==0) { close(connfd[n]); connfd[n]=-1; pthread_exit(&retval); } ticks=time(NULL); sprintf(buff2,"%.24s\r
",ctime(&ticks)); write(connfd,buff2,strlen(buff2)); strcpy(buff,name); strcat(buff,"\t"); strcat(buff,buff2); strcat(buff,buff1); for(i=0;i<MAXMEM;i++) { if(connfd[i]!=-1) { write(connfd[i],buff,strlen(buff)); } } } } }

좋은 웹페이지 즐겨찾기