为什么我在第 57 行读到的 errno 资源已经在使用中?

问题描述

抱歉几乎不可读,我一直在改变变量和值以及 printf'ing 调试语句,所以我可以追踪我的错误,但我似乎无法找到导致我在 57 时读取挂起的原因.

fcntl 在 40 时停止读取,在 18 时停止读取,但在 57 时不会做同样的事情。

这是服务器文件


    #include <unistd.h>
    #include <stdio.h>
    #include <sys/socket.h>
    #include <stdlib.h>
    #include <netinet/in.h>
    #include <string.h>
    #include <arpa/inet.h>
    #include <errno.h>
    #include <fcntl.h>
    void write_file(int sockfd)
    {
        printf("1.0\n");
        int data,filenamdat,st,errnum,bytesize;
        FILE *fp;
        char fileName[100];
        char byte[16];
        printf("1.1\n");
        filenamdat = read(sockfd,fileName,100);
        fcntl(sockfd,F_SETFL,O_NONBLOCK);
        printf("%s\n",fileName);
        if(filenamdat == -1)
        {
            printf("filenamedat...\n");
            errnum = errno;
            fprintf(stderr,"Value of errno: %d\n",errno);
            perror("Error printed by perror");
            fprintf(stderr,"Error opening file: %s\n",strerror( errnum ));
            exit(0);
        }
        printf("1.2\n");
        char *buffer;
        buffer = (char*)malloc(sizeof(buffer)*sizeof(char));
        char filenameadd[107] = "SERVER";
        strcat(filenameadd,fileName);
    
        printf("1.3.0\n");
        fp = fopen(filenameadd,"w");
        printf("1.3.1\n");
        printf("%s\n",filenameadd);
        st = read(sockfd,byte,16);
        fcntl(sockfd,O_NONBLOCK);
        printf("1.3.2\n");
        bytesize = atoi(byte);
        if(st == -1)
        {
            printf("st...\n");
            errnum = errno;
            fprintf(stderr,strerror( errnum ));
            exit(0);
        }
        printf("1.4\n");
        //This entire while loop is basically the issue. 
        while (1) 
        {
            printf("1.5\n");
            data = read(sockfd,buffer,1024); 
    //This is the read that hangs no matter what I do.
    //I set it equal to an int and then did an errno check to see what the problem was.
    //It says resource already in use but I cant seem to find a solution to it.

 
            if(data == -1)
            {
                printf("readbuffer...\n");
                errnum = errno;
                fprintf(stderr,errno);
                perror("Error printed by perror");
                fprintf(stderr,strerror( errnum ));
                exit(0);
            }
            printf("%d\n",data);
            printf("1.6\n");
            if (data <= 0)
            {
                printf("1.91\n");
                break;
                return;
            }
            printf("1.7\n");
            fprintf(fp,"%s",buffer);
            printf("1.8\n");
            bzero(buffer,1024);
            printf("1.9\n\n");
        }
        return;
    }
    void sendFile()
    {
    
    }
    
    void server()
    {
        int sockfd,sock,portnum,connfd,errnum;
        int opt = 1;
        struct sockaddr_in addr,client = {};
        char* addrbuff;
        addrbuff = (char*)malloc(sizeof(addrbuff)*sizeof(void*));
        portnum = 8080;
        sockfd = socket(AF_INET,SOCK_STREAM,0);
        if (sockfd == -1) 
        {
            printf("Failed to create socket.\n");
            exit(0);
        }
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = htonl(INADDR_ANY);
        addr.sin_port = htons(portnum);
    
        inet_ntop(AF_INET,&addr.sin_addr.s_addr,addrbuff,sizeof(addr));
    
        if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR | SO_REUSEPORT,&opt,sizeof(opt)))
        {
            perror("setsockopt");
            exit(EXIT_FAILURE);
        }
    
        if ((bind(sockfd,(struct sockaddr*)&addr,sizeof(addr))) != 0) 
        {
            printf("Failed to bind socket.\n");
            printf("Connection with the server Failed...\n");
            errnum = errno;
            fprintf(stderr,strerror( errnum ));
            exit(0);
        }
        if ((listen(sockfd,10)) != 0) 
        {
            printf("Failed to listen.\n");
            errnum = errno;
            fprintf(stderr,strerror( errnum ));
            exit(0);
        }
    
        printf("Listening on %s and port %d.\n",ntohs(addr.sin_port));
    
        socklen_t client_len = sizeof(client);
    
        connfd = accept(sockfd,(struct sockaddr*)&client,&client_len);
    
        if (connfd < 0) 
        {
            printf("Accept Failed.\n");
            errnum = errno;
            fprintf(stderr,strerror( errnum ));
            exit(0);
        }
        char command[5];
        char fileName[100];
        char bytes[16];    
        int w,e,st; 
        printf("Client accepted.\n");
        bzero(fileName,100);
        bzero(command,5);
        bzero(bytes,16);
        w = read(connfd,command,5);
        printf("%s\n",command);
        if(strncmp(command,"PUSH",4) == 0)
        {
            printf("1\n");
            write_file(connfd);
            printf("2\n");
        }
        return;
    }
    
    
    
    int main(int argc,char* argv[])
    {
        int port;
        char Address[1024];
        if(argc == 1)
        {
            server();
        }
        else
        {
            printf("%s\n","Client/server functions never reached.");
            return 0;    
        }
        return 0;
    }

这是客户端文件

我无法更改此文件,因为它是由我的合作伙伴编写的,并且是只读的。不过,它似乎正在做它应该做的一切。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <errno.h>
    
    void pushFile(char *fileName,int clientSocket){
        FILE *fp;
        struct stat stats;
        int intfileSizeinBytes;
        char fileSizeinBytes[10];
    
        int w = send(clientSocket,sizeof(fileName)+1,0);//sending filename to server
        int st = stat(fileName,&stats);
        if(st == -1){
            printf("Error in stat method...\n");
        } else {
            intfileSizeinBytes = (int)stats.st_size;
            intfileSizeinBytes+=2;
            sprintf(fileSizeinBytes,"%d",intfileSizeinBytes);
        }
        printf("sizeoffilebytes: %ld\n",sizeof(fileSizeinBytes));
        w = send(clientSocket,fileSizeinBytes,sizeof(fileSizeinBytes),0); //send filesize to server
        if(w == -1){
            printf("Error in sending file size...\n");
            exit(0);
        }
    
    
        char data[intfileSizeinBytes];
    
        fp = fopen(fileName,"r");
        if(fp == NULL){
            printf("File can't be opened...\n");
            exit(0);
        }
    
        while(fgets(data,intfileSizeinBytes,fp) != NULL){
            int tmp;
            tmp = send(clientSocket,data,sizeof(intfileSizeinBytes),0); //sending data to server
            printf("%s\n",data);
            if(tmp == -1){
                printf("Error in sending data...\n");
                exit(0);
            }
            bzero(data,intfileSizeinBytes);
        }
        fclose(fp);
    
    }
    
    void pullFile(char *fileName,int clientSocket,FILE *fp){
        
        char buff[1024],fileLength[100];
        
    
        fp = fopen(fileName,"w+");
        if(fp == NULL){
            printf("File can't be opened...\n");
            exit(0);
        }
    
        int w = send(clientSocket,sizeof(fileName),0);//send file name to server
        if(w == -1){
            printf("Error in sending file name\n");
            exit(0);
        }
    
        w = recv(clientSocket,fileLength,100,0);//recieve file size from server
        if(w == -1){
            printf("Error in recieving file\n");
            exit(0);
        }
    
        int intfileLength = atoi(fileLength);
    
        char file[intfileLength]; //makes a "string" that will contain the file data
    
        w = recv(clientSocket,buff,intfileLength,0); //recieves the actual file
    
        fprintf(fp,file); //prints data into file
        bzero(file,intfileLength);
    
        fclose(fp);
    
    }
    
    int main(){
    
        int clientSocket;
        struct sockaddr_in serverAddr;
        char buffer[1024];
    
    
        clientSocket = socket(AF_INET,0); //creates a client socket
    
        if(clientSocket == -1){
            printf("Socket Failed...\n");
            exit(0);
        }
        printf("Socket success...\n"); 
    
        bzero(&serverAddr,sizeof(serverAddr));
    
        serverAddr.sin_family = AF_INET;
        serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //Change
        serverAddr.sin_port = htons(8080);
    
        int c = connect(clientSocket,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
    
        if(c == -1){ //connects the socket to the given address
           printf("Connection with the server Failed...\n");
           exit(0);
        } 
        printf("Connection with the server success...\n");
    
        int flag = 1;
        printf("This is a remote backup system.\nYou can send files,retrieve files,and exit\n");
        printf("To send files type [PUSH 'filename']\n");
        printf("To retrieve a file from the server type [PULL 'filename']\n");
        printf("To exit type [QUIT]\n");
        while(flag == 1){
            char command[5]; 
            char fileName[100];
    
            scanf("%s",command); //%s %s
    
            if(strncmp(command,4) == 0){
                printf("Please specify file you want to transer to server:\n");
                scanf("%s",fileName);
                printf("%s\n",fileName);
    
                int w = send(clientSocket,sizeof(command),0);
                if(w == -1){
                    printf("Sending command to server Failed...\n");
                    exit(0);
                }
                pushFile(fileName,clientSocket);
                printf("File sent...\n");
    
            } else if(strncmp(command,"PULL",4) == 0){
                FILE *fp;
                printf("Please specify file you want to recieve from server:\n");
                scanf("%s",0);
                if(w == -1){
                    printf("Sending command to server Failed...\n");
                    exit(0);
                }
                pullFile(fileName,clientSocket,fp);
                printf("File recieved...\n");
                printf("PULL\n");
            } else if(strncmp(command,"QUIT",4) == 0){
                printf("QUIT\n");
                flag--;
            } else {
            printf("Please enter an actual command\n");
            }
        }
        close(clientSocket);
    
    
        return 0;
        
    }

我已经醒了 16 个小时试图解决这个问题,但完全碰壁了。即使您看到我可以做的一些小事,但任何事情都会有所帮助,以提高效率并减少意大利面。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)