TCP 파일 수신 서버<윈도우 기반>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <time.h>// 시간구조체 가져오기
#pragma comment(lib, "ws2_32.lib")
#define BUFSIZE 1024
void eh(char* meg);
int main(int argc, char *argv[])
{
WSADATA wd;
SOCKET hss;
SOCKET hcs;
SOCKADDR_IN sadd;
SOCKADDR_IN cadd;
FILE* fp;// 파일 포인터
int scadd;// 클라이언트 주소크기변수
int strl;//입력버프 크기
char meg[BUFSIZE];
char* str;// 클라이언트 주소저장 포인터
time_t logint;// 시간형 변수 선언
struct tm* t;// 시간구조체 변수 선언
if(argc!=2)
{
printf("Usage : %s <port>\n",argv[0]);
exit(1);
}
fp=fopen("recvclient.dat","w");// 파일 생성
if(fp==NULL)
eh("File open error");
if(WSAStartup(MAKEWORD(2,2),&wd)!=0)
eh("WSAStartup() error!");
hss=socket(PF_INET,SOCK_STREAM,0);//서버소켓생성TCP
if(hss==INVALID_SOCKET)
eh("socket() error");
memset(&sadd,0,sizeof(sadd));
sadd.sin_family=AF_INET;
sadd.sin_addr.s_addr=htonl(INADDR_ANY);
sadd.sin_port=htons(atoi(argv[1]));
if(bind(hss,(SOCKADDR*)&sadd,sizeof(sadd))==SOCKET_ERROR)
eh("bind() error");
if(listen(hss,5)==SOCKET_ERROR)
eh("listen() error");
scadd=sizeof(cadd);
hcs=accept(hss,(SOCKADDR*)&cadd,&scadd);
if(hcs==INVALID_SOCKET)
eh("accept() error");
logint=time(NULL);//현재시간 저장
t=localtime(&logint);//함수호출
str=inet_ntoa(cadd.sin_addr);// 주소변환저장
printf("NO%d Client Address : %s\n",hcs,str);//주소출력
printf("Login time : %2d:%02d:%02d\n",t->tm_hour,t->tm_min,t->tm_sec);//시간출력
while((strl=recv(hcs,meg,BUFSIZE,0))!=0)//파일내용받고
fwrite(meg,sizeof(char),strl,fp);//쓰고
send(hcs,"Save file\n",10,0);//보내고
fclose(fp);
closesocket(hcs);
WSACleanup();
return 0;
}
void eh(char* meg)
{
fputs(meg,stderr);
fputc('\n',stderr);
exit(1);
}