问题描述
我是编程新手,但我正在尝试使用 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;
}