Это мой код:
#include <stdio.h>
#include <unistd.h>
#include <windows.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main(){
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in serverAddr, clientAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(6969);
serverAddr.sin_addr.s_addr = INADDR_ANY;
bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
listen(serverSocket, 1);
int s_size = sizeof(struct sockaddr_in);
SOCKET clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &s_size);
char cwd[1024];
getcwd(cwd, 1024);
printf(cwd);
send(clientSocket, cwd, sizeof(cwd), 0);
return 0;
}
Он предназначен для отправки cwd программы в скрипт python, но всякий раз, когда я запускаю скрипт python, он выдает мне эту ошибку, когда получает cwd:
cwd = clientSocket.recv(1024).decode("utf-8").strip()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd4 in position 44: invalid continuation byte
Всякий раз, когда я печатаю cwd в программе C, он печатается без проблем. Я пробовал нулевое завершение строки следующим образом:
cwd[strlen(cwd)] = 0;
Это ничего не изменило.
Мое лучшее предположение заключается в том, что данные между фактическим путем и нулевым терминатором являются причиной ошибки кодирования в конце сценариев python, но я не могу выделить достаточно памяти для пути, потому что я не могу знать длину пути перед выделением памяти, поэтому я выбрал 1024, так как считал, что это разумное значение.
Кто-нибудь знает, как я могу это исправить?
РЕДАКТИРОВАТЬ: я решил это. В строке cwd было много мусора вместе с фактической строкой из-за большого размера буфера (1024). Вместо этого мне удалось выделить память для cwd и перераспределить ее на его strlen().
char *cwd = malloc(1024*sizeof(char));
getcwd(cwd, 1024);
realloc(cwd, strlen(cwd));
printf(cwd);
send(clientSocket, cwd, strlen(cwd), 0);
Это сработало для меня.
char
, включая мусор после байта NUL. Попробуйтеsend(clientSocket, cwd, strlen(cwd) + 1, 0);
- person Steve Friedl   schedule 24.12.2019clientSocket
. - person Andrii   schedule 24.12.2019