2014-03-13 5 views
1

아래 소켓 코드와 클라이언트 코드가 있습니다. 지금까지는 서버와의 연결을 설정하는 것이 전부지만 클라이언트에서 서버로 파일을 보내기를 원합니다. 파일에 데이터가없는 경우에도 마찬가지입니다. 파일을 보내기 위해이 코드를 보완하려면 어떻게해야합니까? 코드 양식의 제안 사항은 무엇입니까?소켓 프로그래밍 C - 서버에서 클라이언트로 파일 보내기

클라이언트 :

#include <sys/socket.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <arpa/inet.h> 

int main(int argc, char *argv[]) 
{ 
    int sockfd = 0, n = 0; 
    char recvBuff[1024]; 
    struct sockaddr_in serv_addr; 

    if(argc != 2) 
    { 
     printf("\n Usage: %s <ip of server> \n",argv[0]); 
     return 1; 
    } 

    memset(recvBuff, '0',sizeof(recvBuff)); 
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
    { 
     printf("\n Error : Could not create socket \n"); 
     return 1; 
    } 

    memset(&serv_addr, '0', sizeof(serv_addr)); 

    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_port = htons(5000); 

    if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0) 
    { 
     printf("\n inet_pton error occured\n"); 
     return 1; 
    } 

    if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) 
    { 
     printf("\n Error : Connect Failed \n"); 
     return 1; 
    } 

    while ((n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0) 
    { 
     recvBuff[n] = 0; 
     if(fputs(recvBuff, stdout) == EOF) 
     { 
      printf("\n Error : Fputs error\n"); 
     } 
    } 

    if(n < 0) 
    { 
     printf("\n Read error \n"); 
    } 

    return 0; 
} 

서버 :

#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <sys/types.h> 
#include <time.h> 

int main(int argc, char *argv[]) 
{ 
    int listenfd = 0, connfd = 0; 
    struct sockaddr_in serv_addr; 

    char sendBuff[1025]; 
    time_t ticks; 

    listenfd = socket(AF_INET, SOCK_STREAM, 0); 
    memset(&serv_addr, '0', sizeof(serv_addr)); 
    memset(sendBuff, '0', sizeof(sendBuff)); 

    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    serv_addr.sin_port = htons(5000); 

    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

    listen(listenfd, 10); 

    while(1) 
    { 
     connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 

     ticks = time(NULL); 
     snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks)); 
     write(connfd, sendBuff, strlen(sendBuff)); 

     close(connfd); 
     sleep(1); 
    } 
} 

답변

0

나는이 컴파일 시도 havn't는,이 코드는 확실히 광택이 아니라 비슷한 트릭을 할 것입니다 아래에 :)

클라이언트 끝을 다음과 같이 수정하십시오.

if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) 
{ 
    printf("\n Error : Connect Failed \n"); 
    return 1; 
} 

FILE *inputFile = fopen("inputFile.txt", "rb"); 

if(inputFile == NULL) 
{ 
    fprintf(stderr, "oh no!"); 
    return 1; 
} 

char sendBuffer[10]; 

// TODO: Check for errors here 
int bytesRead = fread(sendBuffer, sizeof(sendBuffer), 1, inputFile); 

while(!feof(inputFile)) 
{ 
    //TODO: check for errors here 
    send(sockfd, sendBuffer, bytesRead, 0); 
    bytesRead = fread(sendBuffer, sizeof(sendBuffer), 1, inputFile); 
} 
close(sockfd); 

는 다음과 같이하는 서버 측 수정 : 당신이 정말 좋은뿐만 아니라, 내 실수 코드를 수정하여 멀티 스레드 버전으로이 만들 수 있도록하고 서버가 새를 생성하고 싶었 경우

listen(listenfd, 10); 

FILE *outputFile = fopen("output.txt", "wb"); 

if(outputFile == null) 
{ 
    fprintf(stderr, "Something went south!"); 
    return 1; 
} 

while(1) 
{ 
    connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 

    char recvBuff[10]; 

    ticks = time(NULL); 
    int bytesReceived = recv(confd, recvBuff, 10, 0); 
    while(bytesReceived != 0) 
    { 

     // you should add error checking here 
     fwrite(recvBuff, bytesReceived, 1, outputFile); 

     bytesReceived = recv(confd, recvBuff, 10, 0); 
    } 

    close(connfd); 
} 
+0

수신 한 각 클라이언트 요청에 대한 스레드. 스레드에 대해 아직 알지 못했다면, 괜찮습니다.하지만 한 번에 하나의 클라이언트에 대해서만 작동합니다. –

+0

이런 종류의 것을 배우는 좋은 방법은 좋은 책을 찾는 것입니다. Graham Glass (http://www.amazon.com/UNIX-Programmers-Users-3rd-Edition/dp/0130465534)의 "프로그래머와 사용자를위한 유닉스"를 적극 권장합니다. –

+0

Thanks @NickWeedon. 한 번에 하나의 파일 만 처리하면되므로 여러 스레드가 실제로 필요하지 않습니다. 또한 데이터가없는 파일도 처리 할 수 ​​있어야한다는 점을 잊어 버렸습니다. 이것을 고려할 것인가? 아니면 보내고 수정해야합니까? –

관련 문제