Wysyłanie zawartości katalogu przez sieć - netcat nie zbiera wszystkich danych

0
#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

1

Właśnie udało mi się rozwiązać problem. Wygląda na to, że problemy wystąpiły w związku z niezamykaniem socketa

1 użytkowników online, w tym zalogowanych: 0, gości: 1