#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <dirent.h>
#include <unistd.h>
/* link with ws2_32.lib in order to use winsock library */
#pragma comment(lib, "ws2_32.lib")
char *GetUserDirectory()
{
char *userDirPath = getenv("USERPROFILE");
if (userDirPath == NULL)
perror("");
return userDirPath;
}
void sendDirContent(SOCKET sock, char *userDir)
{
DIR *dir;
struct dirent *ent;
dir = opendir(userDir);
if (dir != NULL)
{
while ((ent = readdir(dir)) != NULL)
{
send(sock, ent->d_name, strlen(ent->d_name) + 1, 0);
}
}
closedir(dir);
}
int main()
{
WSAData winsockInitStruct;
SOCKET sock;
sockaddr_in client;
int err = 0;
WSAStartup(MAKEWORD(2, 0), &winsockInitStruct);
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
/* structure with information about the connection's target */
client.sin_family = AF_INET;
client.sin_addr.s_addr = inet_addr("172.16.160.10");
client.sin_port = htons(5555);
connect(sock, (SOCKADDR *)&client, sizeof(client));
char *userDir = GetUserDirectory();
send(sock, userDir, strlen(userDir), 0);
sendDirContent(sock, userDir);
WSACleanup();
return 0;
}
Wiem, że ten program nie jest przepiękny, ale to narzędzie ad-hoc więc specjalnie się nie starałem. Ma on za zadanie przesyłać zawartość katalogu przez sieć i działać pod Windowsem. Żeby odbierać dane użyłem netcata
nasłuchującego na porcie 5555
(nc -lvp 5555
).
Niestety zaraz po odebraniu ścieżki
katalogu, który ma zostać przesłany przez sieć netcat
zamyka się przez co zawartość katalogu nie dociera do odbiorcy. Jeśli zmienię strlen
na sizeof
w tej części programu (wewnątrz funkcji sendDirContent
):
while ((ent = readdir(dir)) != NULL)
{
send(sock, ent->d_name, sizeof(ent->d_name), 0);
}
zawartość katalogu zawsze
dociera do adresata, natomiast w przypadku wersji z strlen
jednym razem dociera a innym razem nie. Czy w moim programie występuje jakieś UB
? Ktoś może ma pomysł jak rozwiązać ten problem? Tutaj jest link do dokumentacji funkcji readdir
-> https://man7.org/linux/man-pages/man3/readdir.3.html może się przyda