Chatting Project
전자공학부 20123222
서 기 원
목차
1. 진행과정
2. 소스 분석
3. 성능 및 결과
* https://github.com/Giwon-Seo/adv-sys-programming
( chat_final.c 파일)
1. 20개의 클라이언트를 실행
(독립적인 프로세스 또는 thread)
Server
Client_2
Client_1
Client_20
Client_3
입력받은 클라이언트 수에
맞게 pthread 생성
2.모든 클라이언트가 서버에 연결
Server
Client_2
Client_1
Client_20
Client_3
Connect
서버는 listen
클라이언트 connect
Server Socket listen
Server Socket bind
Server Socket listen
서버는 listen, 클라이언트 connect
클라이언트 connect
서버는 listen
Server Accept
엣지트리거로 전환
3. 서버는 20개의 클라이언트가 연결된 것을 확인하고
모든 클라이언트에 문자 ‘$’를 보냄
Server
Client_2
Client_1
Client_20
Client_3
send ‘$’
Case 1. 서버가 클라이언트로 데이터를 보낼 때
Server
Thread 2 Client_2
Thread 1
Client_1
②store rdata
0 1 2 3 4 5 6 7
rdata
①Send data
③data 처리
③ read
rdata0 1 2 3 4 5 6 7
rdata ②store rdata
서버는 모든 클라이언트 accept 시 문자 ‘$’를 모든 클라이언트에게 보냄
Num_fd[i] 는 각각 client
와 연결된 Socket이 저장
클라이언트 입장에서 보면
서버에게서 받은 데이터를
rdata에 저장
처음 서버로부터 받은 데이터(File
번호, ’$’ 처리 후 모드 변경
4. 각 클라이언트는 1MB의 Text 데이터를 서버에 한 줄씩 송신함과 동시에
수신된 메시지를 각자 파일에 저장
(case 1, 2 동시에 사용)
Server
Client_2
Client_1
Client_20
Client_3
send & recv
http://www.joinc.co.kr/w/Site/Thread/Begi
nning/Mutex
Case 1. 서버가 클라이언트로 데이터를 보낼 때
Server
Thread 2 Client_2
Thread 1
Client_1
②store rdata
0 1 2 3 4 5 6 7
rdata
①Send data
③data 처리
③ read
rdata0 1 2 3 4 5 6 7
rdata ②store rdata
Server 입장에서 보면
연결된 소켓에서 받은 data를 `data’에
저장, 크기는 ret & count 에 저장
Non blocking Mode 이므로
Recv 를 못 받았을 때 Error 처리를
꼭 해줘야 함
Server 입장에서 보면
받은 데이터를 모든 client 에게 send
클라이언트 입장에서 보면
서버에게서 받은 데이터를 rdata에
저장
상황에 따라 저장
Client_mode ==1 : 송수신 모드
Client_mode ==2 : 수신모드
( 송신을 다 했을경우)
Case 2. 클라이언트가 서버로 데이터를 보낼때
Server
Thread 2 Client_2
Thread 1 Client_1
0 1 2 3 4 5 6 7
rdata
0 1 2 3 4 5 6 7
rdata
0 1 2 3 4 5 6 7data
①Send data ①Send data
② Store data to `data’
클라이언트 입장에서
Client_mode ==1 : 송수신 모드일때
sendFile 함수를 통해 한 줄씩 send
sendFile return 값을 통해 송신여부 결정, 송신
할 데이터가 없으면 Client_mode ==2 로 전환
클라이언트 입장에서
Pbuf 를 통해서 ‘n’ 을
찾은 후, 서버로 send
[* non-block 모드이기
때문에 send의 리턴값
(send된 data의 길이)
확인 후 전송]
5. 클라이언트는 모든 데이터를 송신한 뒤 ‘@’를 송신 (이 ‘@’는 서버가
수신만 하고 클라이언트에 전달하지 않음)
Server
Client_2
Client_1
Client_20
Client_3
send ‘@’
Only recv
클라이언트 입장에서
Client 에게 할당된 파일
을 다 보냈을 때, 서버에
게 ‘@’문자를 보냄
서버입장에서
Client 에게 보낸 data에
서 ‘@’ 가 있는지 확인,
있으면 ‘@’ 제외하고
data를 갱신한다.
그리고 송신이 끝난
client의 수를 체크한다.
6. 서버는 모든 클라이언트에 수신된 Text를 모두 보낸 뒤에, 20개
클라이언트에 ‘%’를 송신
Server
Client_2
Client_1
Client_20
Client_3send ‘%’
서버입장에서
송신이 다 끝났으면
모든 클라이언트에게 보
낼 데이터의 마지막에
‘%’ 를 추가해서 보낸다.
7. 클라이언트는 ‘%’를 수신하면 연결을 종료
Server
Client_2
Client_1
Client_20
Client_3
각각 Closed
클라이언트 입장에서 보면
서버로부터 ‘%’ 를 받으면
나머지 데이터를 저장하고
클라이언트 소켓을 종료한다.
8. 클라이언트는 ‘%’를 수신하면 연결을 종료
Server
Closed
서버입장에서 보면
클라이언트로 받은 recv 의 리
턴값이 0이면 클라이언트가
종료 됐다는 뜻이므로, 그 수
를 다 새서, 클라이언트 총수
와 같을 때 서버를 종료
성 능
클라이언트의 개수를 3개로 했을 때,
걸린 시간은 15초 정도였다.
오 류
클라이언트의 개수를 3개 이상으로 했을 때,
클리이언트에서는 bus error
서버 쪽에서는 Connect reset by peer 오류
가 계속 나서 성공하지 못했다.
결 론
1. 소켓 프로그램에 대한 정보를
얻을 수 있었다.
2. 다중 소켓 접속은 일부 성공
3. Non blocking mode 에 대한
지식을 얻음

고급시스템프로그래밍 Project#2 20123222_서기원