🧼C, C++/네트워크

소켓 파일전송 C++ #2

Mawile 2020. 11. 26.
728x90

 

개발환경 >> DevCpp

언어 >> C++11

운영체제 >> Windows10

 

 

 


 

[[[   지난글   ]]]

 

소켓 파일전송 C++ #1

시작하기 앞서서 사용한 운영체제는 Windows10이며 사용된 IDE는 DevCpp이고, 사용한 언어는 C++11입니다! [[[  참고자료  ]]] 소켓 기본 틀 소켓 기본틀 [[[  서버 기본 틀  ]]] #include #include using nam..

mawile.tistory.com

 

 


 

 

안녕하세요 심심하기도하고

복습할겸 소켓간의 파일전송하는 방법을 하나 더 만들어봤습니다

저번보다는 더 심플하게 최대한 만들려고했습니다

 

 

728x90

 


[[[   서버(송신)   ]]]

#include <iostream> //Sender
#include <winsock2.h>

using namespace std;

void StrToChr(string str,char *chr){ //string->char 형변환함수
	int cnt=0,i;
	while(str[cnt]!='\0') cnt++;
	for(i=0;i<sizeof(chr);i++) chr[i]='\0';
	for(i=0;i<cnt;i++) chr[i]=str[i];
}

int main(){
	WSADATA wsa;
	WSAStartup(MAKEWORD(2,2),&wsa);
	
	SOCKET server = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
	
	SOCKADDR_IN addr={0};
	addr.sin_family=AF_INET;
	addr.sin_port=htons(8080);
	addr.sin_addr.s_addr=htonl(INADDR_ANY);
	
	bind(server,(SOCKADDR*)&addr,sizeof(addr));
	listen(server,SOMAXCONN);
	
	SOCKADDR_IN client_sock={0};
	int client_size=sizeof(client_sock);
	SOCKET client=accept(server,(SOCKADDR*)&client_sock,&client_size);
	
	const int len=1024;
	char buf,path[len]={0},buff[len]={0};
	string str;
	FILE *fp;
	
	while(1){
		getline(cin,str); //띄어쓰기포함 입력
		StrToChr(str,path);
		
		fp=fopen(path,"rb"); //읽기모드로 해당경로에 파일열기
		if(fp==NULL){ //안열렸거나 빈내용이면 break
			fclose(fp);
			break;
		}
		
		fseek(fp,0,SEEK_END); //파일포인터 끝에가서
		int filesize=ftell(fp); //사이즈재고
		fseek(fp,0,SEEK_SET); //파일포인터 처음으로
		sprintf(buff,"%d",filesize); //형변환
		send(client,buff,len,0); //사이즈전송
		
		while(1){
			buf=fgetc(fp); //파일 1바이트단위로 읽기
			if(!feof(fp)) send(client,&buf,sizeof(char),0); //1바이트 전송
			else break; //다보내면 break
		}
		fclose(fp); //파일닫기
	}
}

 

 

 

 

 

[[[   클라이언트(수신)   ]]]

#include <iostream> //Receiver
#include <winsock2.h>

#define FILE_SOURCE "E:\\test.exe" //파일경로지정

using namespace std;

int main(){
	WSADATA wsa;
	WSAStartup(MAKEWORD(2,2),&wsa);
	
	SOCKET server = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
	
	SOCKADDR_IN addr={0};
	addr.sin_family=AF_INET;
	addr.sin_port=htons(8080);
	addr.sin_addr.s_addr=inet_addr("127.0.0.1"); //localhost
	
	while(connect(server,(SOCKADDR*)&addr,sizeof(addr))); //묵시적으로 연결시도
	
	const int len=1024;
	char buf,path[len]={0},buff[len]={0};
	string str;
	FILE *fp;
	
	while(1){
		recv(server,buff,len,0); //파일크기받기
		fp=fopen(FILE_SOURCE,"wb"); //파일쓰기모드로 열기
		if(fp==NULL){ //비어있으면 break
			fclose(fp);
			break;
		}
		
		int filesize=atoi(buff); //파일크기 형변환
		
		while(1){
			recv(server,&buf,sizeof(char),0); //1바이트단위로 데이터받기
			fputc(buf,fp); //실제파일 내용입력
			filesize--; //filesize=filesize-1;
			if(filesize<=0) break; //만약 파일사이즈가 0이거나 음수면은 break
		}
		fclose(fp); //파일닫기
	}
}

 

 

 

 

와우~ 저번글보다는 확실히 소스코드가 보기쉽죠??

그리고 저번보다 더 안정적인소스코드입니다.

저번소스코드는 어느정도 파일사이즈가 맞지않았지만 이번거는 진짜 완전히 동일합니다.

 

 


 

[[[   시연   ]]]

 

 

 

 


 

궁금한 부분이 있다면

댓글로 질문주세요

그러면

감사합니다!!

728x90

댓글