본문 바로가기
Tip&Skill

[TCP/IP] TCP로 파일수신하기

by 하센세 2009. 3. 23.


#include        
#include        
       
#pragma comment(lib, "wsock32.lib")         
        
void main()         
{         
    SOCKET s, cs;         
    WSADATA wsaData;   
    struct sockaddr_in sin;   
    struct sockaddr_in cli_addr;   
    int size = sizeof(cli_addr);
	
	char data[1024]={0,};   
    FILE *fp;   
    int ret;  
	int nTimeOut = 3000;

	       
    if( WSAStartup(WINSOCK_VERSION, &wsaData) != 0 ){      
        printf("WSAStartup 실패, 에러코드 = %d\n", WSAGetLastError());      
        return;      
    }      
           
    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);         
     
    if(s==INVALID_SOCKET){      
        printf("소켓 생성 실패, 에러코드 : %d\n", WSAGetLastError());      
        WSACleanup();      
        return;      
    }      
       
    sin.sin_family = AF_INET;      
    sin.sin_port = htons(10000);   
    sin.sin_addr.s_addr = htonl(ADDR_ANY);   
       
          
	if( bind(s, (struct sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR){
		printf("바인드 실패, 에러코드 = %d\n", WSAGetLastError());
		closesocket(s);
		WSACleanup();
		return;
	}   
  
	if( listen(s, SOMAXCONN) != 0){
		printf("리슨 실패, 에러코드 = %d\n", WSAGetLastError());
		closesocket(s);
		WSACleanup();
		return; 
	}

  
    puts("클라이언트의 연결을 기다리고 있습니다...\n");   
  
    cs = accept(s, (struct sockaddr*)&cli_addr, &size);   
  
    if(cs == INVALID_SOCKET) {   
        printf("소켓생성실패, 에러코드 : %d\n", WSAGetLastError());   
        WSACleanup();   
        return;   
    }   
  
	fp = fopen("c:\\recv.txt", "w+b");

	if(fp==NULL){
		perror("파일생성에러");
		closesocket(cs);
		closesocket(s);
		WSACleanup();
		return;
	}
	
	setsockopt(cs, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTimeOut, size);

	while(1){
		ret = recv(cs, data, 1024, 0);

		if(ret == 0) break;

		if(ret == SOCKET_ERROR){
			printf("수신에러, 에러코드 : %d\n", WSAGetLastError());   
			closesocket(cs);
			closesocket(s);
			WSACleanup();   
			fclose(fp);
			return;   
		}
		fwrite(data, 1, ret, fp);
		printf("%d bytes를 수신하였습니다.\n", ret);
	}
	fclose(fp);
	shutdown(s, SD_BOTH);
	
	if(closesocket(s)!=0 || closesocket(cs)!=0){            
        printf("소켓 제거 실패, 에러코드 = %u\n", WSAGetLastError());         
        WSACleanup();            
        return;            
    }            
        
    if(WSACleanup() != 0){         
        printf("WSACleanup 실패, 에러코드 = %u\n", WSAGetLastError());         
        return;         
    }          
	   
}