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;
 
}
Posted by cyj4369
,