C中涉及套接字和客户端-服务器通信的程序出现问题

时间:2019-06-08 10:37:49

标签: c sockets server directory client

我正在使用C语言开发一个程序,该程序涉及客户端与服务器之间的连接以及两方之间的通信。

该程序涉及客户端向服务器发送一封信,并且服务器收到该信件。然后,服务器在当前文件目录(在Linux中)中搜索以该字母开头的文件,并向客户端发送该文件的字节数和该文件的文本。

整个程序很长,对于任务分配,讲师已经做了很多代码,例如设置套接字和为操作的客户端创建整个程序。

对于服务器端,我必须为以下代码编写代码:

  • 从传递的内存中获取文件描述符并进行投射

-收到客户的来信

-尝试打开当前目录

-遍历目录以查找以字母开头的文件

-尝试打开文件并将文件的大小和文件的字节数以网络字节序发送给客户端

-完成后关闭文件和目录

-错误检查:如果无法打开目录,无法打开文件或找不到匹配的文件,则会有错误检查语句

以下是我的注释代码

Event event = documentSnapshot.getValue(Event.class);
LatLng latLng = new LatLng(event.getLatitude(), event.getLongitude());
mMap.addMarker(new MarkerOptions().position(latLng));

我的代码可以编译,但是在我尝试运行该文件时不会将其发送给客户端。我尝试了几种不同的字母,但对任何一个字母都无效。我不太清楚问题是什么,这使得我很难纠正错误。

我没有要求答案或任何其他内容,只是帮助您了解我错了什么。感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您何时发送与何时发送无文件状态的逻辑似乎是错误的。我认为应该是这样的(警告,我没有测试它,甚至没有经过基本语法检查就编译了它,但是您应该明白这个想法):

void* handleClient(void*  vPtr)
{
    //  I.  Application validity check:
    int fd = *((int *) vPtr);
    free(vPtr);

    //  II.  Handle the client:
    char buffer[BUFFER_LEN+1];
    read(fd, buffer, BUFFER_LEN+1);
    //read the letter into a buffer//

    const char* dirNamePtr = ".";
    DIR* dirPtr = opendir(dirNamePtr);
    //   Open the current directory

    if (dirPtr == NULL)
    {
        int toSend = htonl(CANT_READ_DIR_CODE);
        write(fd,&toSend,sizeof(toSend));
        printf("Cannot read directory\n");
        return(NULL);
    }

    struct dirent* entryPtr;
    char path[BUFFER_LEN];
    struct stat statBuffer;
    //implements struct dirent to get info on the directory

    //iterates through the directory
    while ((entryPtr=readdir(dirPtr)) != NULL)
    {
        stat(entryPtr->d_name, &statBuffer);
        //puts in metaddata of the current directory into statbuffer

        // if this isn't a regular file OR the first char doesn't match...
        if (!S_ISREG(statBuffer.st_mode) || entryPtr->d_name[0]!=buffer[0])
            continue;

        int ab;
        int numRead;
        int numBytes;
        char buffer[BUFFER_LEN];
        //open the file and send bytes of file and file size to client

        ab = open(entryPtr->d_name,O_RDONLY,0660);

        if(ab<0) {
            int toSend3 = htonl(CANT_READ_FILE_CODE);
            write(fd,&toSend3, sizeof(toSend3));
            printf("Cannot read <filename>\n");
            closedir(dirPtr);
            return(NULL);
        }

        numBytes=htonl(statBuffer.st_size);
        write(fd, &numBytes, sizeof(numBytes));

        printf("Sending %s, %d bytes\n",entryPtr >d_name,statBuffer.st_size);
        while((numBytes=read(ab,buffer,BUFFER_LEN))>0)
        {
            printf("We read %d bytes\n", numBytes);
            write(fd, buffer, numBytes);
        }

        //close the file and leave
        close(ab);
        break;
    }

    // if this is NULL it means we dind't send anything. we break the loop
    //  when a file to send it discovered.
    if (entryPtr == NULL)
    {
        printf("No matching file\n");
        int toSend2 = htonl(NO_MATCH_CODE);
        write(fd, &toSend2, sizeof(toSend2));
    }

    //  III.  Finished:
    closedir(dirPtr);

    return(NULL);
}