C++Window 환경 채 팅 방 기능 구현

5433 단어 C++채 팅 방
C++Window 환경 채 팅 방,참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
요즘 은 한가 해서 C++의 병행 프로 그래 밍 과 Socket 정보 전송 을 배우 고 싶 어서 채 팅 방 을 매개체 로 학습 하고 있 습 니 다.말 이 많 지 않 으 니 코드 를 작성 하 세 요.
채 팅 방 은 여러 개의 클 라 이언 트 와 서버 로 나 뉜 다.서버 는 각 클 라 이언 트 가 보 낸 정 보 를 받 은 다음 에 각 클 라 이언 트 에 게 전달 하여'중개'역할 을 한다.클 라 이언 트 는 메 시 지 를 보 내 고 메 시 지 를 받 을 수 있 습 니 다.
1.서버
위 에서 말 한 바 와 같이 서버 가 해 야 할 일 은:
① 새로운 클 라 이언 트 연결 요청 수락
② 연 결 된 클 라 이언 트 의 새로운 소식 을 듣는다.
③ 연 결 된 각 서버 에 받 은 정 보 를 하나씩 전송
그래서 저 는 서버 에 두 개의 스 레 드 가 있 고 한 스 레 드 는 ① 기능 을 담당 하 며 한 스 레 드 는 ② ③ 기능 을 담당 합 니 다.
① 경청 클 라 이언 트 연결 요청 스 레 드 만 들 기

void CreateListenThread(int sock_serve,list<int>*users){
    sockaddr_in user_addr;
    int user_size = sizeof(user_addr);
 
    //     
    while(1){
        //       100ms,       cpu
        this_thread::sleep_for(chrono::milliseconds(100));
        int user_sock = accept(sock_serve,(sockaddr*)(&user_addr),&user_size);
        if(user_sock==-1){
            //     
            continue;
        }
        if(user_sock!=INVALID_SOCKET){
            lock_guard<mutex>mtx_locker(mtx);
            (*users).push_back(user_sock);
            cout<<"      client:"<<user_sock<<endl;
        }
    }
    return;
}
 ②  클 라 이언 트 가 보 내 는 메 시 지 를 듣 는 스 레 드 를 만 듭 니 다.

//    
void Broadcast(list<int>*users, char *str){
    for(auto iter=users->begin();iter!=users->end();iter++){
        int flag = send(*iter, str, strlen(str)+1, 0);
        if(!flag){
            cout<<*iter<<"      "<<endl;
        }
    }
    return;
}
void CreateRecvThread(int sock_serve,list<int>*users){
    char revc_string[maxLen];
    int recvbuffs;
    while(1){
        this_thread::sleep_for(chrono::milliseconds(300));
        lock_guard<mutex>mtx_locker(mtx);
        for(auto iter=users->begin();iter!=users->end();){
            recvbuffs = recv(*iter, revc_string,maxLen,0);
//            cout<<"iter="<<*iter<<" len="<<recvbuffs<<endl;
            if(recvbuffs==0){
                cout<<"   :"<<*iter<<"   !!"<<endl;
                users->erase(iter++);
                continue;
            }
            else if(recvbuffs<0){
                iter++;
            }
            else{
                cout<<string(revc_string,recvbuffs)<<endl;
                Broadcast(users, revc_string);  //     
                memset(revc_string,0,sizeof(revc_string));
                iter++;
            }
        }
    }
    return;
}
여기 서 내 가 설정 한 것 은 서버 가 어떤 클 라 이언 트 가 보 낸 메 시 지 를 받 은 후에 바로 전송 하 는 것 이다.만약 에 높 은 병발 에 발생 하 는 문 제 를 해결 해 야 한다 면 저 는 여기 서 제안 을 구상 하고 quue 대기 열 을 설정 합 니 다.서버 가 메 시 지 를 받 은 후에 바로 메 시 지 를 대기 열 에 기록 합 니 다.또한 하나의 스 레 드 를 만 들 면 주로 대기 열 에 있 는 메 시 지 를 방송 하 는 것 을 책임 집 니 다(물론 대기 열 은 서로 배척 해 야 합 니 다).그래서 서버 가 메 시 지 를 보 내 고 메 시 지 를 받 아들 이 는 것 을 해결 합 니 다.
2.클 라 이언 트
상기 에서 말 한 바 와 같이 클 라 이언 트 가 여기 서 해 야 할 일 은:
①"전화 하기",즉 지 정 된 서버 와 연결
② 메시지 보 내기
③ 다른 모든 클 라 이언 트 의 메 시 지 를 수신
그래서 이 부분 에서 저 는 두 개의 스 레 드 를 만 들 었 습 니 다.한 스 레 드 는 주로 메 시 지 를 보 내 고 한 스 레 드 는 주로 메 시 지 를 받 습 니 다.
①  메시지 보 낼 스 레 드 만 들 기

//     
void CreateSendThread(int socket_client, const char *name){
    char send_string[maxLen],tmp[maxLen];
    while(1){
        this_thread::sleep_for(chrono::milliseconds(300));
 
        lock_guard<mutex>mtx_locker(mtx);
        memset(send_string,0,sizeof(send_string));
        scanf("%s",tmp);
 
        strcat(send_string,name);
        strcat(send_string," :");
        strcat(send_string,tmp);
        send(socket_client, send_string,strlen(send_string)+1,0);
    }
    return;
}
send()함 수 를 통 해 데이터 정 보 를 지정 한 서버 로 전송 합 니 다.
② 서버 방송 정 보 를 듣 는 스 레 드 를 만 듭 니 다.

//     
void CreateRecvThread(int sock_client){
    char buff[maxLen];
    while(1){
        this_thread::sleep_for(chrono::milliseconds(300));
 
        lock_guard<mutex>mtx_locker(mtx);
        int revc_len=recv(sock_client,buff,sizeof(buff),0);
        if(revc_len==0){
            cout<<"      ,    !"<<endl;
            break;
        }
        else if(revc_len<0)continue;
        else{
            printf("%s
",buff); memset(buff,0,sizeof(buff)); } } }
revc()함 수 를 통 해 서버 방송 메 시 지 를 받 습 니 다.
반환 값==0 시 서버 연결 이 끊 겼 습 니 다.스 레 드 를 끝내 야 합 니 다.
반환 값<0  서버 에서 메 시 지 를 전송 하지 않 았 습 니 다.
반환 값>0 시 서버 에서 데 이 터 를 전송 합 니 다(주의:빈 문자열 을 전송 할 때 반환 값 도 1)
3.실험 결과

위의 그림 에서 왼쪽 하 나 는 서버 이 고 왼쪽,왼쪽 세 가 지 는 클 라 이언 트 입 니 다.클 라 이언 트 가 메 시 지 를 보 낼 때 다른 클 라 이언 트 가 모두 메 시 지 를 받 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기