/* ************************************************** */
/*    Image Sender Program  (X86 version)             */
/*    This Program is to check the jpeg image file    */
/*    and send the jpeg image file to HBE-SM          */
/*                                                    */
/*   # project -> Setting -> Link                     */
/*           -> Object/linrary modules -> ws2_32.lib  */
/*                   2006.7.7  Made By Jung Yong Hak  */
/* ************************************************** */
// header file
#include <winsock2.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define BUFSIZE 4096
#define MAX 256
// function
void err_quit(char *msg);
void err_display(char *msg);
void get_filename(void);
void file_send(void);
// argument
struct tm *newtime;
time_t aclock;
SOCKET sock;
int retval,tmp,count;
char file_original[MAX];
int main(int argc, char* argv[])
{
 printf("Image Sender Programn");
 printf("=========================================n");
 ZeroMemory(file_original, MAX);
 // 윈도우소켓 초기화
 WSADATA wsa;
 if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
  return -1;
 count=0;
 // 무한 loop
 while(1)
 {
  get_filename();  //파일이름 알아오기
  file_send();  //파일 보내기
 }
 // 윈도우소켓 종료
 WSACleanup();
 return 0;
}

// image file send function
void file_send(void)
{
 // get_filename()함수로 얻어 온 file_original로 file open
 FILE *fp = fopen(file_original, "rb");
 //file 이 없을 시에
 if(fp == NULL)
  count=0;
 //file 이 있을 시에
 if(fp != NULL)
 {
  // socket()
  SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
  if(sock == INVALID_SOCKET) err_quit("socket()");
   
  // connect()
  SOCKADDR_IN serveraddr;
  ZeroMemory(&serveraddr, sizeof(serveraddr));
  serveraddr.sin_family = AF_INET;
  serveraddr.sin_port = htons(9000);
  serveraddr.sin_addr.s_addr = inet_addr("192.168.123.165");
  retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));
  if(retval == SOCKET_ERROR) err_quit("connect()");
 
  // 파일 이름 보내기
  char filename[MAX];
  ZeroMemory(filename, MAX);   //메모리 초기화
  sprintf(filename,file_original); //file_original을 filename으로 copy
 
  // filename은 보내고자 하는 데이터의 첫 번째 위치를 가리키는 포인터
  // MAX(=256) 는 보낼 데이터의 바이트 수
  // return값은 실제로 전송한 바이트의 수 실패시 -1 리턴
  retval = send(sock, filename, MAX, 0);
  if(retval == SOCKET_ERROR ) err_quit("send()");
  puts(filename);  //filename 출력
  // 파일 크기 얻기
  fseek(fp, 0, SEEK_END);   // offset을 파일의 끝으로 위치
  int totalbytes = ftell(fp);  // 현재 offset을 리턴
  retval = send(sock, (char *)&totalbytes, sizeof(totalbytes), 0);
  if(retval == SOCKET_ERROR) err_quit("send()");
 
  // 파일 데이터 전송에 사용할 변수
  char buf[BUFSIZE];
  int numread;
  int numtotal = 0;
  // 파일 데이터 보내기
  rewind(fp); // 파일 포인터를 제일 앞으로 이동
  while(1)
  {
   // fp로부터 1바이트의 데이터를 BUFSIZE(=4096)개수만큼 읽어 들여서
   // buf가 가리키는 버퍼로 저장. 성공적으로 읽어들인 단위 데이터의 개수 리턴
   numread = fread(buf, 1, BUFSIZE, fp);
   
   if(numread > 0)
   {
    // buf에 있는 데이터의 첫 번째 위치를 가리키는 포인터
    // numread는 보낼 데이터의 바이트 수
    retval = send(sock, buf, numread, 0);
    if(retval == SOCKET_ERROR)
    {
     err_display("send()");
     break;
    }
    numtotal += numread; //현재 읽어서 보낸 바이트수만큼 + 해준다
   }
   else if(numread == 0 && numtotal == totalbytes)
   {
    printf("파일 전송 완료!: %d 바이트n", numtotal);
    //파일명이 00 01 02 로 저장되는걸 구분하기 위한 변수
    if(count==0)
     count=1;
    else if(count==1)
     count=2;
    else if(count==2)
     count=0;
    break;
   }
   else
   {
    perror("파일 입출력 오류");
    break;
   }
  }
  fclose(fp);
  closesocket(sock);
 }
}

/* **************************************************************************** */
/* 파일명 알아오기 함수                                                         */
/* 실시간으로 디렉토리안에 파일이 생기는지 직접적으로 알수 있는 방법이 없어서   */
/* 다른 방법을 사용. 웹캠이 움직임 감지시 저장할 때 현재 시간으로 저장을 하기   */
/* 때문에 시간구조체를 사용하여 현재시간을 알아온 뒤 그걸로 파일명을 만든다     */
/* 그 파일명으로 파일을 open해서 성공하면 그 파일명이 있다는걸로 판단하고       */
/* 파일을 보내고 open해서 실패하면 그 파일명이 없는걸로 판단하고 안보낸다.      */
/* **************************************************************************** */
void get_filename(void)
{
 Sleep(50);
 time( &aclock );     // 시간값 읽기(초단위로 저장)
 newtime = localtime( &aclock );  // tm 구조체로 변환
 char file_old[MAX];
 char file_tmp[MAX]="MT ";
 //윈도우 웹캠이 jpeg파일 저장시 Motion Tracking Images 폴더를 만들고 안에 저장한다
 char file_new[MAX]="Motion Tracking Images\";
 
 tmp=newtime->tm_mon;
 tmp+=1;
 sprintf(file_old, "%02d",  tmp); //해당월을 file_old에 저장
 strcat(file_tmp,file_old);   //file_tmp 밑에 월을 연이어 저장
 tmp=newtime->tm_mday;    //해당일을 계산하고 file_tmp밑에  저장
 sprintf(file_old, "%02d", tmp);
 strcat(file_tmp,file_old);
 file_old[0]='_';     // "_" 로 구분자를 만들어 줌
 strncat(file_tmp,file_old,1);
 tmp=newtime->tm_hour;    //해당시간을 계산하고 file_tmp 밑에 저장
 sprintf(file_old, "%02d", tmp);
 strcat(file_tmp,file_old);
 tmp=newtime->tm_min;    //해당분을 계산하고 file_tmp 밑에 저장
 sprintf(file_old, "%02d", tmp);
 strcat(file_tmp,file_old);
 tmp=newtime->tm_sec;    //해당초를 계산하고 file_tmp 밑에 저장
 //5초를 뺀 이유는 윈도우 웹캠이 움직임 감지하고 저장할때까지 시간차이때문에
 tmp-=5;
 sprintf(file_old, "%02d", tmp);
 strcat(file_tmp,file_old);
 file_old[0]='-';     // "_" 로 구분자를 만들어 줌
 strncat(file_tmp,file_old,1);
 file_old[0]='0';
 strncat(file_tmp,file_old,1);
 // 1초안에 여러장이 찍힐때는 파일명 저장시 00 01 02 이런식으로 저장된다
 if(count==0)
 {
  file_old[0]='0';
  strncat(file_tmp,file_old,1);
 }
 else if(count==1)
 {
  file_old[0]='1';
  strncat(file_tmp,file_old,1);
 }
 else if(count==2)
 {
  file_old[0]='2';
  strncat(file_tmp,file_old,1);
 }else
  count=0;
 file_old[0]='.';    //마지막 .jpg 까지 file_tmp에 붙여줌
 strncat(file_tmp,file_old,1);
 file_old[0]='j';
 strncat(file_tmp,file_old,1);
 file_old[0]='p';
 strncat(file_tmp,file_old,1);
 file_old[0]='g';
 strncat(file_tmp,file_old,1);
 strcat(file_new,file_tmp);  // file_tmp를 file_new뒤에 붙임
 strcpy(file_original,file_new); // file_new를 file_original에 copy
}
// 소켓 함수 오류 출력 후 종료
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);
}
Posted by 용학도리
,