쓰레드와 소켓 프로그래밍
본 자료는 3페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
해당 자료는 3페이지 까지만 미리보기를 제공합니다.
3페이지 이후부터 다운로드 후 확인할 수 있습니다.

소개글

쓰레드와 소켓 프로그래밍에 대한 보고서 자료입니다.

목차

1. 개념

2. 구현 설명

3. 소스 코드

4. 실행화면

5. 소감

본문내용

0))==-1){
perror("Recv Failed");
exit(1);
}
recvBuffer[recvLen] = '\0'; //문자열로 만들어주기 위함
//종료 Sign을 Client에서 보내면 작업이 끝난다.
if(!strcmp(recvBuffer,ENDSIGN)){
break;
}
//시작 Signal을 Client에서 보내면 자료를 받을 준비를 한다.
if(!strcmp(recvBuffer,READYSIGN)){
Ready = 1;
continue;
}
//Client에서 파일의 이름을 보낸 경우 이름을 저장하고 그 이름으로
//파일을 생성한다.
if(Ready == 1){
strcpy(transFilename,recvBuffer);
f = fopen(transFilename,"w");
Ready = -1;
continue;
}
//처음, 끝의 Sign, 그리고 파일제목이 아닌경우는 파일에 데이터를 쓴다.
else if(Ready == -1){
fputs(recvBuffer,f);
}
}
printf("Stop Server Socket\n");
fclose(f);
close(clntSockfd);
close(servSockfd);
/*Server Socket 종료*/
}
void ClientFunction(void){
FILE *f;
char sendBuffer[BUFSIZE];
int sockfd;
/*server로 보낸 파일을 읽기 모드로 연다.*/
if((f=fopen(transFilename,"r"))==NULL){
printf("%s is not found\n",transFilename);
exit(1);
}
/*Socket을 생성한다.*/
if((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1 ){
perror("Client Socket Failed");
exit(1);
}
/*서버에 접속 허가를 요청한다.*/
printf("Try connecting Server..\n");
if(connect(sockfd,(struct sockaddr *)&servAddr,sizeof(servAddr)) == -1){
perror("Connect Failed");
exit(1);
}
/*Server에 준비 Sign을 보낸다.*/
usleep(500000);
if(send(sockfd,READYSIGN,strlen(READYSIGN),0) != strlen(READYSIGN)){
printf("Send Failed\n");
perror("Send Failed - ReadySign");
exit(1);
}
/*Server에 File이름을 보낸다.*/
usleep(500000);
printf("Try Sending Filename.. \n");
if(send(sockfd,transFilename,strlen(transFilename),0)
!= strlen(transFilename)){
perror("Send Failed - transFilename");
exit(1);
}
/*Server에 파일의 데이터를 보낸다.*/
usleep(500000);
printf("Try Sending Data.. \n");
while(!feof(f)){//파일의 끝을 만날 때까지 반복한다.
fgets(sendBuffer,BUFSIZE,f);
if(send(sockfd,sendBuffer,strlen(sendBuffer),0) != strlen(sendBuffer)){
perror("Send Failed - Datas");
exit(1);
}
usleep(500000);
}
/*Server에 끝났음을 알리는 신호를 보낸다.*/
printf("Success Sending Data.. \n");
usleep(500000);
if(send(sockfd,ENDSIGN,strlen(ENDSIGN),0) != strlen(ENDSIGN)){
perror("Send Failed - ENDSIGN");
exit(1);
}
printf("Stop Client Socket \n");
fclose(f);
close(sockfd);
/*Client Socket 종료*/
}
/*Thread 실행 함수*/
void *thread_function(void *arg){
printf("%s",(char *)arg);
ClientFunction(); //Client의 작업을 수행하게 한다.
usleep(500000);
pthread_exit("Thread Function End");
}
4. 실행화면
초기화면
< Process1 >
< Process2 >
< Process3 >
결과화면
< Process1 >
< Process2 >
< Process3 >
5. 소감
어느 일이 든지 다 그렇겠지만, 이번 Term Project는 실수를 많이 하여 사서 고생을 하였다.
처음 고난의 시작은 sockaddr_in 구조체에 도메인의 종류를 기술하지 않으면서 시작되었다. 생각한 대로 분명히 하였는데 서버 쪽에서 아무런 반응이 없는 것을 몇 시간 동안 지켜보다 도메인을 기술하지 않았다는 것을 알았다. 이것을 코딩해주고 나니 서버와 클라이언트간에 어떤 대화가 시작되기 시작했다.
두 번째 고난은 방화벽이었다. “no route to host"라는 생소한 에러 메시지와 함께 클라이언트가 서버에 접속 허락을 받지 못하였다. 인터넷의 여러 조언을 받아 보조 DNS가 잘 못 되어 있어서 그런 것인지 확인하고 기본 게이트웨이를 확인하는 등 여러 가지 네트워크 설정을 변경해 보았지만, 결국 문제는 방화벽이라는 간단한 놈이었다. 방화벽을 없애고 나니 깔끔하게 접속이 되었다.
마지막은 Thread가 장식하였다. Thread를 사용하면 컴파일을 할 때 또 다른 옵션인 -lpthread가 필요하다는 것을 몰랐던 것이다. 마지막으로 다다르는 순간에 좌절감을 안겨줬던 Thread까지 쉽지 않은 Term Project였다.
그러나 실제로 Thread와 Socket을 이용하여 리눅스 상에서 프로그래밍 해보니 윈도우에서 이때까지 했던 것과 크게 다르지 않다는 점에서 다음에 또 도전해 볼 만한 일이라는 생각이 들었다.

키워드

소켓,   쓰레드,   파일전송,   socket,   thread
  • 가격1,000
  • 페이지수10페이지
  • 등록일2009.10.05
  • 저작시기2008.10
  • 파일형식한글(hwp)
  • 자료번호#555096
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니