본문 바로가기
Tip&Skill

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

by 하센세 2009. 3. 23.
#include           
#include           
          
#pragma comment(lib, "wsock32.lib")            
           
void main(int argc, char *argv[])            
{            
    
	SOCKET s;            
    WSADATA wsaData;
	struct sockaddr_in sin;      
	char data[1024];
	FILE *fp;
	int ret;
	int nRead;

	if(argc < 2){
		printf("전송할 파일명을 입력하십시오.\n");
		printf("ex)sample.exe file.txt\n");
		return;
	}
              
    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 = inet_addr("127.0.0.1");   
          
   if(connect(s, (struct sockaddr*)&sin, sizeof(sin)) != 0){      
        printf("접속 실패, 에러코드 = %u\n", WSAGetLastError());      
        closesocket(s);      
        WSACleanup();      
     
    }      

   fp = fopen(argv[1], "rb");

   if(fp==NULL){
	   perror("file open error");
	   closesocket(s);
	   WSACleanup();
	   return;
   }

   while(1){
	   nRead = fread(data, 1, 1024, fp);

	   if(ferror(fp)){
		   perror("file read error");
		   closesocket(s);
		   WSACleanup();
		   fclose(fp);
		   return;
	   }

	   ret = send(s, data, nRead, 0);
	   
	   if(ret == SOCKET_ERROR||ret!=nRead){
		   printf("데이터 송신 실패, 에러코드 = %u\n", WSAGetLastError());
		   closesocket(s);
		   WSACleanup();
		   fclose(fp);
		   return;
	   }
	   printf("%d bytes를 송신하였습니다.\n", ret);
	   if(feof(fp)) break;
   }
	
   fclose(fp);

   printf("%s 파일을 전송하였습니다.\n", argv[1]);

   shutdown(s, SD_BOTH);
        
    if(closesocket(s)!=0){         
        printf("소켓 제거 실패, 에러코드 = %u\n", WSAGetLastError());      
        WSACleanup();         
        return;         
    }         
     
    if(WSACleanup() != 0){      
        printf("WSACleanup 실패, 에러코드 = %u\n", WSAGetLastError());      
        return;      
    }             
}