/* 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);
}
'[+] Information > [-] Network' 카테고리의 다른 글
[2009/06/21] 도메인 이름과 IP주소의 변환. (0) | 2009.06.21 |
---|---|
[2009/06/21] 도메인 이름과 DNS (0) | 2009.06.21 |
[2009/06/13] 소켓 연결의 우아한 종료 (0) | 2009.06.13 |
[2009/06/09] 예제소스(cecho_clienet.c, uecho_client_win.c) (0) | 2009.06.09 |