🧼C, C++/네트워크
소켓 파일전송 C++ #2
개발환경 >> DevCpp
언어 >> C++11
운영체제 >> Windows10
[[[ 지난글 ]]]
안녕하세요 심심하기도하고
복습할겸 소켓간의 파일전송하는 방법을 하나 더 만들어봤습니다
저번보다는 더 심플하게 최대한 만들려고했습니다
[[[ 서버(송신) ]]]
#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); //파일닫기
}
}
와우~ 저번글보다는 확실히 소스코드가 보기쉽죠??
그리고 저번보다 더 안정적인소스코드입니다.
저번소스코드는 어느정도 파일사이즈가 맞지않았지만 이번거는 진짜 완전히 동일합니다.
[[[ 시연 ]]]
궁금한 부분이 있다면
댓글로 질문주세요
그러면
감사합니다!!
'🧼C, C++ > 네트워크' 카테고리의 다른 글
다중 스트림서버 C++ TCP #1 (0) | 2020.12.31 |
---|---|
다중 클라이언트 C++ TCP #3 (수정본) (2) | 2020.12.24 |
소켓 커스텀 송수신함수 구현 C++ (0) | 2020.11.26 |
다중 클라이언트 C++ TCP #3 (1) | 2020.11.09 |
다중 클라이언트 C++ TCP #2 (2) | 2020.11.05 |
댓글