winsock을 이용한 파일 보내기(C++) 소스
#include<winsock2.h>
#include<stdio.h>
#include<stdlib.h>
#define BUFSIZE 4096
// 소켓 함수 오류 출력 후 종료
void err_quit(char *msg)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf, 0, NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, msg, MB_ICONERROR);
LocalFree(lpMsgBuf);
exit(-1);
}
// 소켓 함수 오류 출력
void err_display(char *msg)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf, 0, NULL);
printf("[%s] %s", msg, (LPCTSTR)lpMsgBuf);
LocalFree(lpMsgBuf);
}
int main(int argc, char *argv[])
{
int err;
if(argc < 2){
fprintf(stderr, "Usage: %s <FileName>\n", argv[0]);
return -1;
}
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2),&wsa) !=0 )
return -1;
SOCKET senderSock = socket(AF_INET,SOCK_STREAM, 0);
if(senderSock == INVALID_SOCKET){
err_quit("socket()");
}
// connect()
SOCKADDR_IN senderaddr;
ZeroMemory(&senderaddr,sizeof(senderaddr));
senderaddr.sin_family = AF_INET;
senderaddr.sin_port = htons(9000);
senderaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
err = connect(senderSock, (SOCKADDR *)&senderaddr,sizeof(senderaddr));
if(err == SOCKET_ERROR) err_quit("connect()");
//파일 열기
FILE *fp = fopen(argv[1],"rb");
if(fp== NULL)
{
perror("파일 입출력 오류");
return -1;
}
//파일 이름 보내기
char filename[256];
ZeroMemory(filename,256);
sprintf(filename,argv[1]);
err = send(senderSock,filename,256,0);
//if(err == SOCKET_ERROR) err_quit("send()");
//파일 크기 얻기
fseek(fp,0,SEEK_END);//파일 포인터를 파일의 끝으로 옮김
int totalbytes = ftell(fp);
printf("크기 :%d bytes\n",totalbytes); //ansi로 된 text파일에 있는 문자
err = send(senderSock,(char *)&totalbytes,sizeof(totalbytes),0);
if(err == SOCKET_ERROR) err_quit("send()");
//파일 데이터 전송에 사용할 변수
char buf[BUFSIZE];
int numread;
int numtotal = 0;
//파일 데이터 보내기
rewind(fp); // 파일 포인터를 제일 앞으로 이동
while(1){
numread = fread(buf, 1, BUFSIZE, fp);
if(numread > 0){
err = send(senderSock, buf, numread, 0);
if(err == SOCKET_ERROR){
err_display("send()");
break;
}
numtotal += numread;
}
else if(numread == 0 && numtotal == totalbytes){
printf("파일 전송 완료!: %d 바이트\n", numtotal);
break;
}
else{
perror("파일 입출력 오류");
break;
}
}
fclose(fp);
closesocket(senderSock);
WSACleanup();
return 0;
}
'Development > C/C++' 카테고리의 다른 글
[파일 입출력 함수(fopen, feof, fseek)] (0) | 2011.11.03 |
---|---|
[general error c101008a: Failed to save the updated manifest to the file 오류해결법] (0) | 2011.11.03 |
[화면 처리 함수(gotoxy, wherex, wherey)] (0) | 2011.11.02 |
[시스템 함수(exit, system)] (0) | 2011.11.02 |
[시간 관련 함수(time, ctime, clock 등)] (0) | 2011.11.02 |