/* ************************************************** */
/* 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 */
/* ************************************************** */
/* 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>
#include <winsock2.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define BUFSIZE 4096
#define MAX 256
#define MAX 256
// function
void err_quit(char *msg);
void err_display(char *msg);
void get_filename(void);
void file_send(void);
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];
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);
{
printf("Image Sender Programn");
printf("=========================================n");
ZeroMemory(file_original, MAX);
// 윈도우소켓 초기화
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
return -1;
count=0;
WSADATA wsa;
if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
return -1;
count=0;
// 무한 loop
while(1)
{
get_filename(); //파일이름 알아오기
file_send(); //파일 보내기
}
while(1)
{
get_filename(); //파일이름 알아오기
file_send(); //파일 보내기
}
// 윈도우소켓 종료
WSACleanup();
return 0;
}
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;
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()");
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()");
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을 리턴
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;
if(retval == SOCKET_ERROR) err_quit("send()");
// 파일 데이터 전송에 사용할 변수
char buf[BUFSIZE];
int numread;
int numtotal = 0;
// 파일 데이터 보내기
rewind(fp); // 파일 포인터를 제일 앞으로 이동
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);
{
// 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);
}
}
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 ";
{
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 밑에 월을 연이어 저장
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);
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);
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);
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);
//5초를 뺀 이유는 윈도우 웹캠이 움직임 감지하고 저장할때까지 시간차이때문에
tmp-=5;
sprintf(file_old, "%02d", tmp);
strcat(file_tmp,file_old);
file_old[0]='-'; // "_" 로 구분자를 만들어 줌
strncat(file_tmp,file_old,1);
strncat(file_tmp,file_old,1);
file_old[0]='0';
strncat(file_tmp,file_old,1);
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;
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);
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
}
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_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);
}
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);
}