使用 Winsock 和 dirent 向客户端发送目录列表的问题

问题描述

我是编程新手,但我正在尝试使用 C++ 创建一个带有 Winsock 的 TCP 服务器,它将使用 dirent 将所有主机文件和目录的列表发送到客户端。到目前为止,代码创建了服务器,列出了它的所有目录,并将其中一个名称发送给客户端。我不明白为什么只发送一个目录名称,尽管所有目录名称都列在服务器的计算机上。

一个代码块创建套接字。问题似乎在第二块

#include<io.h>
#include<stdio.h>
#include<winsock2.h>
#include <iostream>
#include <dirent.h>
#include <sys/types.h>
#include <string>
#pragma comment(lib,"ws2_32.lib") 
 using namespace std;
 


int main(int argc,char *argv[])
{
    WSADATA wsa;
    SOCKET s,new_socket;
    struct sockaddr_in server,client;
    int c;
    char *message;
 
    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d",WSAGetLastError());
        return 1;
    }
     
    printf("Initialised.\n");
     
    //Create a socket
    if((s = socket(AF_INET,SOCK_STREAM,0 )) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d",WSAGetLastError());
    }
 
    printf("Socket created.\n");
     
    //Prepare the sockaddr_in structure
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );
     
    //Bind
    if( bind(s,(struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR)
    {
        printf("Bind Failed with error code : %d",WSAGetLastError());
    }
     
    puts("Bind done");
 
    //Listen to incoming connections
    listen(s,3);
     
    //Accept and incoming connection
    puts("Waiting for incoming connections...");
     
    c = sizeof(struct sockaddr_in);
    new_socket = accept(s,(struct sockaddr *)&client,&c);
    if (new_socket == INVALID_SOCKET)
    {
        printf("accept Failed with error code : %d",WSAGetLastError());
    }
     
    puts("Connection accepted");

这是列出和发送目录的内容

//List directory
   DIR *dr;
   struct dirent *en;
   dr = opendir("."); //open all or present directory
   if (dr) {
      while ((en = readdir(dr)) != NULL) {
         printf("%s\n",en->d_name); //print all directory name
      message = ("%s\n",en->d_name); //Problem line?
      }
      closedir(dr); //close all directory
   }

    send(new_socket,message,strlen(message),0);
     
    getchar();
 
    closesocket(s);
    WSACleanup();
     
    return 0;
}

如果您能帮助我了解问题以及解决方法,我将不胜感激。

解决方法

我编辑了上面显示的第二个代码块,这最终奏效了。

    DIR *dr;
   struct dirent *en;
   dr = opendir("."); //open all or present directory
   if (dr) {
      while ((en = readdir(dr)) != NULL) {
         printf("%s\n",en->d_name);
         char buffer[300];
         sprintf(buffer,"%s\n",en->d_name); //saves info to buffer
        send(new_socket,buffer,strlen(buffer),0); //sends the buffer as a message
      }
      closedir(dr); //close all directory
   }

    send(new_socket,message,strlen(message),0);
     
    getchar();
 
    closesocket(s);
    WSACleanup();
     
    return 0;
}