2016-10-23 2 views
0

저는 소켓 프로그래밍에있어 매우 새로운 기술입니다. 나는 서버 측과 클라이언트 측 코드를 작성하여 UDP를 통해 파일을 보내고있다. c. 두 우분투 bash를 실행할 때 코드를 컴파일하지만 서버 측 코드는 잘 작동하지만 클라이언트 쪽에서 오류가 발생합니다 : open : No such file or directory 누구나 나를 도와주세요 !!!open : UDP 클라이언트에 해당 파일이나 디렉토리가 없습니다.

다음
/************* UDP SERVER CODE *******************/ 


#include <fcntl.h> 
#include <netdb.h> /* getprotobyname */ 
#include <sys/stat.h> 
#include <stdio.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <string.h> 
#include <stdlib.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <ctype.h> 

int main(){ 
    int udpSocket, nBytes; 
    char buffer[BUFSIZ]; 
    struct sockaddr_in serverAddr, clientAddr; 
    struct sockaddr_storage serverStorage; 
    socklen_t addr_size, client_addr_size; 
    int i; 
    int client_sockfd; 
    int filefd; 
    ssize_t read_return; 
    char *file_path = "output.txt"; 


    /*Create UDP socket*/ 
    udpSocket = socket(PF_INET, SOCK_DGRAM, 0); 

    /*Configure settings in address struct*/ 
    serverAddr.sin_family = AF_INET; 
    serverAddr.sin_port = htons(7891); 
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero); 

    /*Bind socket with address struct*/ 
if(bind(udpSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr))!=0) 
    printf("Not binded\n"); 
    else 
    printf("Binded and listening\n"); 


    /*Initialize size variable to be used later on*/ 
    addr_size = sizeof serverStorage; 


    while (1) { 
    /*client_addr_size = sizeof(clientAddr); 
    puts("waiting for client"); 
    client_sockfd = accept(udpSocket,(struct sockaddr*)&clientAddr,&client_addr_size);*/ 
    puts("waiting for client"); 
    nBytes = recvfrom(udpSocket,buffer,BUFSIZ,0,(struct sockaddr *)&serverStorage, &addr_size); 

    filefd = open(file_path,O_WRONLY | O_CREAT | O_TRUNC,S_IRUSR | S_IWUSR); 
    if (filefd == -1) { 
     perror("open"); 
     exit(EXIT_FAILURE); 
    } 
    do { 
     read_return = read(nBytes, buffer, BUFSIZ); //read from the client's buffer// 
     if (read_return == -1) { 
      perror("read"); 
      exit(EXIT_FAILURE); 
     } 
     if (write(filefd, buffer, read_return) == -1) { 
      perror("write"); 
      exit(EXIT_FAILURE); 
     } 
    } while (read_return > 0); 
    close(filefd); 
    close(client_sockfd); 
    } 
    return EXIT_SUCCESS; 
} 

클라이언트 쪽 : 개방

/************* UDP CLIENT CODE *******************/ 

#include <stdio.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <ctype.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <netdb.h> /* getprotobyname */ 
#include <sys/stat.h> 
#include <unistd.h> 
#include <string.h> 

int main(){ 

    int clientSocket, portNum, nBytes; 
    struct sockaddr_in serverAddr; 
    socklen_t addr_size; 
    char *file_path = "input.tmp"; 
    int filefd; 
    ssize_t read_return; 
    char buffer[BUFSIZ]; 
    char *user_input = NULL; 
    char *server_reply = NULL; 

    /*Create UDP socket*/ 
    clientSocket = socket(PF_INET, SOCK_DGRAM, 0); 

    /*Configure settings in address struct*/ 
    serverAddr.sin_family = AF_INET; 
    serverAddr.sin_port = htons(7891); 
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero); 

    /*Initialize size variable to be used later on*/ 
    addr_size = sizeof serverAddr; 


    while (1) { 

    filefd = open(file_path, O_WRONLY | O_APPEND); 
    if (filefd == -1) { 
    perror("open"); 
    exit(EXIT_FAILURE); 
    } 
    else { 
     printf("Type a sentence to send to server/file:\n"); 
     fgets(buffer,BUFSIZ,stdin); 
    write (filefd,buffer,BUFSIZ); 
    printf("You typed: %s",buffer); 
    } 

    read_return = read(filefd, buffer, BUFSIZ); 
    nBytes = strlen(buffer) + 1; 
    if (read_return == 0)//indicated end of file 
     break; 
    if (read_return == -1) { 
     perror("read"); 
     exit(EXIT_FAILURE); 
    } 

    /*Send message to server*/ 
    sendto(clientSocket,buffer,nBytes,0,(struct sockaddr *)&serverAddr,addr_size); 

    /*if (write(clientSocket, buffer, read_return) == -1) { 
     perror("write"); 
     exit(EXIT_FAILURE); 
    }else{printf("input file read successfully into the buffer\n");}*/ 

    } 
    free(user_input); 
    free(server_reply); 
    close(filefd); 
    exit(EXIT_SUCCESS); 
} 
+0

파일이 있습니까? 클라이언트가 다른 디렉토리에서 실행 중일 때 상대 경로를 사용합니까? – blackpen

답변

3

.. i am very new to socket programming..

filefd = open(file_path, O_WRONLY | O_APPEND); 
if (filefd == -1) { 
    perror("open"); 

오류 : 여기

는 서버 쪽 그런 파일이나 디렉토리 프로그래밍을 소켓에 관련이 없습니다. 제 생각 엔 file_path (즉, input.tmp)이 존재하지 않습니다. 존재하지 않는 경우를 대비하여 파일을 만들려면 O_CREAT 플래그도 추가해야합니다. open(2)을 참조하십시오. 존재하지 않는 쓰기하려는 파일이 (당신은 O_CREAT를 사용할 수 있습니다) 때문이다

1

open: No such file or directory

. 첫 번째 오류를 수정하면

read: Bad file descriptor

은 또한 쓰기 전용 모드로 오픈 된 파일에서 읽을려고 노력의 결과이다이 두 번째 오류를 수정 할 수 있습니다.

또한 버퍼에있는 바이트 수만 쓸 수도 있습니다 (전체 BUFSIZ 아님).

+2

첫 번째 문장이 참이 아니라,'read()'호출에서 인용 된 에러가 발생하지 않고'open()'호출에서 인용 된 에러는 그 모드와 관련이 없습니다. 여러분은 그들이 여전히 읽기 모드에서 열길 원한다고 말하고 있거나 나중에'read()'에서 다른 에러를 얻을 것이라고 말하고 있습니다. 단지 그것이 오류라고는 말하지 않습니다. –

+0

@LuisdeArquer, 잘 잡으세요. 복사 - 붙여 넣기 오류였습니다. 지금은 고쳐 졌어. – blackpen

관련 문제