2016-10-23 26 views
0

我對套接字編程非常陌生。我正在編寫一個服務器端和一個客戶端代碼,通過c中的UDP發送文件。這兩個代碼編譯但是當我運行他們在Ubuntu的bash,服務器端代碼工作正常,但客戶端給我一個錯誤:打開:沒有這樣的文件或目錄 任何人都可以請幫助我這個!打開: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"); 

錯誤開放:沒有這樣的文件或目錄無關Socket編程。我的猜測是file_path(即input.tmp)不存在。如果你想創建一個文件,如果它不存在,你也需要添加O_CREAT標誌。見open(2)

1

open: No such file or directory

那是因爲你正試圖不存在的文件(您可能需要使用O_CREAT)。

read: Bad file descriptor

一旦你解決的第一個錯誤,你可能也想解決這個第二個錯誤,這是試圖從在只寫模式中打開的文件讀取的結果。

此外,您可能只想寫入緩衝區中的字節數(不是整個BUFSIZ)。

+2

您的第一句話不是真的,引用的錯誤不會發生在'read()'調用,而是'open()'調用中,並且與模式無關。雖然你說他們仍然希望以讀取模式打開,或者稍後在'read()'處得到不同的錯誤。只是說它不是*那*錯誤。 –

+0

@LuisdeArquer,很好。這是一個複製粘貼錯誤。現在已經糾正。 – blackpen

相關問題