본문 바로가기

[+] Information/[-] Network

[2009/06/13] 예제소스(file_server.c, file_client.c, file_server_win.c, file_client_win.c)

/* file_server.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>

#define BUFSIZE 30

void error_handling(char *message);

int main(int argc, char **argv)
{
 int serv_sd;
 int clnt_sd;
 int fd;
 char buf[BUFSIZE];
 
 struct sockaddr_in serv_addr;
 struct sockaddr_in clnt_addr;
 int clnt_addr_size;
 int len;
 
 if(argc!=2){
  printf("Usage : %s <port>\n", argv[0]);
  exit(1);
 }
 
 /* 접속해오는 클라이언트에게 전송해줄 파일 오픈  */
 fd = open("file_server.c", O_RDONLY);
 if(fd == -1)
  error_handling("File open error");
 
 serv_sd=socket(PF_INET, SOCK_STREAM, 0);  
 if(serv_sd == -1)
  error_handling("socket() error");
 
 memset(&serv_addr, 0, sizeof(serv_addr));
 serv_addr.sin_family=AF_INET;
 serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
 serv_addr.sin_port=htons(atoi(argv[1]));
 
 if( bind(serv_sd, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1 )
  error_handling("bind() error");
 
 if( listen(serv_sd, 5)==-1 )
  error_handling("listen() error");
 
 clnt_addr_size=sizeof(clnt_addr);   
 clnt_sd=accept(serv_sd, (struct sockaddr*)&clnt_addr,&clnt_addr_size);
 if(clnt_sd==-1)
  error_handling("accept() error");
 
 /* 클라이언트에 데이터 전송 */
 while( (len=read(fd, buf, BUFSIZE)) != 0)
 {
  write(clnt_sd, buf, len);
 }
 
 /* 데이터 전송후 소켓의 일부(전송영역)를 닫음 */
 if(shutdown(clnt_sd, SHUT_WR) ==-1)
  error_handling("shutdown error");
 
 /* 인사의 메시지를 수신 함 */
 len = read(clnt_sd, buf, BUFSIZE);
 write(1, buf, len);
 
 close(fd);
 close(clnt_sd);
 return 0;
}

void error_handling(char *message)
{
 fputs(message, stderr);
 fputc('\n', stderr);
 exit(1);
}





/* file_client.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>

#define BUFSIZE 30

void error_handling(char *message);

int main(int argc, char **argv)
{
 int fd;
 int sd;
 
 char buf[BUFSIZE];
 int len;
 struct sockaddr_in serv_addr;

 if(argc!=3){
  printf("Usage : %s <IP> <port>\n", argv[0]);
  exit(1);
 }
 
 /* 수신 한 데이터를 저장 할 파일 오픈 */
 fd = open("receive.dat", O_WRONLY|O_CREAT|O_TRUNC);
 if(fd == -1)
  error_handling("File open error");
 
 /* 서버 접속을 위한 소켓 생성 */
 sd=socket(PF_INET, SOCK_STREAM, 0);  
 if(sd == -1)
  error_handling("socket() error");
 
 memset(&serv_addr, 0, sizeof(serv_addr));
 serv_addr.sin_family=AF_INET;
 serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
 serv_addr.sin_port=htons(atoi(argv[2]));

 if( connect(sd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1 )
  error_handling("connect() error!");
 
 /* 데이터를 전송 받아서 파일에 저장한다 */
 while( (len=read(sd, buf, BUFSIZE )) != 0 )
 {
  write(fd, buf, len);
 }
 
 /* 전송해 준것에 대한 감사의 메시지 전달 */
 write(sd, "Thank you\n", 10); 
 close(fd);
 close(sd);
 return 0;
}

void error_handling(char *message)
{
 fputs(message, stderr);
 fputc('\n', stderr);
 exit(1);
}




/* file_server_win.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

#define BUFSIZE 30

void ErrorHandling(char *message);

int main(int argc, char **argv)
{
 WSADATA  wsaData;
 SOCKET   hServSock;
 SOCKET   hClntSock;
 char buf[BUFSIZE];
 
 FILE* fp;
 SOCKADDR_IN servAddr;
 SOCKADDR_IN clntAddr;
 int clntAddrSize;
 int len;
 
 if(argc!=2){
  printf("Usage : %s <port>\n", argv[0]);
  exit(1);
 }
 
 /* 접속해오는 클라이언트에게 전송해 줄 파일 오픈  */
 fp = fopen("file_server_win.c", "r");
 if(fp == NULL)
  ErrorHandling("File open error");
 
 if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  ErrorHandling("WSAStartup() error!");
 
 hServSock=socket(PF_INET, SOCK_STREAM, 0);  
 if(hServSock == INVALID_SOCKET)
  ErrorHandling("socket() error");
 
 memset(&servAddr, 0, sizeof(servAddr));
 servAddr.sin_family=AF_INET;
 servAddr.sin_addr.s_addr=htonl(INADDR_ANY);
 servAddr.sin_port=htons(atoi(argv[1]));
 
 if( bind(hServSock, (SOCKADDR*) &servAddr, sizeof(servAddr))==SOCKET_ERROR )
  ErrorHandling("bind() error");
 
 if( listen(hServSock, 5)==SOCKET_ERROR )
  ErrorHandling("listen() error");
 
 clntAddrSize=sizeof(clntAddr);   
 hClntSock=accept(hServSock, (SOCKADDR*)&clntAddr,&clntAddrSize);
 if(hClntSock==INVALID_SOCKET)
  ErrorHandling("accept() error");
 
 /* 클라이언트에 데이터 전송 */
 while(1){  
  len=fread(buf, sizeof(char), BUFSIZE, fp);
  send(hClntSock, buf, len, 0);
  if(feof(fp)) break;
 }
 
 /* 데이터 전송후 소켓의 일부(전송영역)를 닫음 */
 if(shutdown(hClntSock, SD_SEND) ==SOCKET_ERROR )
  ErrorHandling("shutdown error");
 
 /* 인사의 메시지를 수신 */
 len = recv(hClntSock, buf, BUFSIZE-1, 0);
 buf[len]=0;
 fputs(buf, stdout);
 fclose(fp);
 closesocket(hClntSock);
 WSACleanup();
 return 0;
}

void ErrorHandling(char *message)
{
 fputs(message, stderr);
 fputc('\n', stderr);
 exit(1);
}




/* file_client_win.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

#define BUFSIZE 30

void ErrorHandling(char *message);

int main(int argc, char **argv)
{
 WSADATA  wsaData;
 SOCKET   hSocket;
 
 char buf[BUFSIZE];
 FILE* fp;
 SOCKADDR_IN servAddr;
 int len;
 
 if(argc!=3){
  printf("Usage : %s <IP> <port>\n", argv[0]);
  exit(1);
 }
 
 fp = fopen("receive.dat", "w");
 if(fp == NULL)
  ErrorHandling("File open error");
 
 if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  ErrorHandling("WSAStartup() error!");
 
 /* 서버 접속위한 소켓 생성 */
 hSocket=socket(PF_INET, SOCK_STREAM, 0);  
 if(hSocket == INVALID_SOCKET)
  ErrorHandling("socket() error");
 
 memset(&servAddr, 0, sizeof(servAddr));
 servAddr.sin_family=AF_INET;
 servAddr.sin_addr.s_addr=inet_addr(argv[1]);
 servAddr.sin_port=htons(atoi(argv[2]));
 
 if( connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr))==SOCKET_ERROR )
  ErrorHandling("connect() error!");
 
 /* 데이터를 전송 받아서 파일에 저장한다 */
 while( (len=recv(hSocket, buf, BUFSIZE, 0)) != 0 )
 {
  fwrite(buf, sizeof(char), len, fp);
 }
 
 /* 전송해 준것에 대한 감사의 메시지 전달 */
 send(hSocket, "Thank you\n", 10, 0);

 fclose(fp);
 closesocket(hSocket);
 WSACleanup();
 return 0;
}

void ErrorHandling(char *message)
{
 fputs(message, stderr);
 fputc('\n', stderr);
 exit(1);
}