open:UDP客户端中没有这样的文件或目录

时间:2016-10-23 10:09:22

标签: c sockets ubuntu udp

我是套接字编程的新手。我正在写一个服务器端和一个客户端代码,用于在c中通过UDP发送文件。两个代码编译然而当我在ubuntu bash上运行它们时,服务器端代码工作正常,但客户端端给我一个错误:打开:没有这样的文件或目录 任何人都可以帮我解决这个问题!

这是服务器端:

bobcount("bobobobBOBBOB")
5

这是客户端:

/************* 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;
}

2 个答案:

答案 0 :(得分:3)

  

..我是套接字编程的新手..

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

错误打开:没有这样的文件或目录与套接字编程无关。我的猜测是file_path(即input.tmp)不存在。如果要在不存在的情况下创建文件,则还需要添加O_CREAT标志。请参阅open(2)

答案 1 :(得分:1)

  

打开:没有这样的文件或目录

这是因为您尝试的文件不存在(您可能想要使用O_CREAT)。

  

读:错误的文件描述符

修复第一个错误后,您可能还想修复此第二个错误,这是尝试从仅以只写模式打开的文件读取的结果。

此外,您可能只想写入缓冲区中的字节数(而不是整个BUFSIZ)。