Ini kode saya:
#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;
}
Ini dimaksudkan untuk mengirim cwd program ke skrip python tetapi setiap kali saya menjalankan skrip python, saya mendapat kesalahan ini ketika menerima cwd:
cwd = clientSocket.recv(1024).decode("utf-8").strip()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd4 in position 44: invalid continuation byte
Setiap kali saya mencetak cwd pada program C, ia akan mencetak tanpa masalah. Saya telah mencoba null mengakhiri string seperti ini:
cwd[strlen(cwd)] = 0;
Itu tidak mengubah apapun.
Tebakan terbaik saya adalah bahwa data antara jalur sebenarnya dan terminator nol adalah apa yang menyebabkan kesalahan pengkodean pada akhir skrip python, tetapi saya tidak dapat mengalokasikan cukup memori untuk jalur tersebut karena saya tidak dapat mengetahui panjang jalur sebelum mengalokasikan memori, jadi saya memilih 1024 karena menurut saya itu adalah nilai yang masuk akal.
Adakah yang tahu bagaimana saya bisa memperbaikinya?
EDIT: Saya menyelesaikannya. String cwd memiliki banyak sampah di dalamnya bersama dengan string sebenarnya karena ukuran buffer yang besar (1024). Saya berhasil mengalokasikan memori untuk cwd dan mengalokasikannya kembali ke strlen()-nya.
char *cwd = malloc(1024*sizeof(char));
getcwd(cwd, 1024);
realloc(cwd, strlen(cwd));
printf(cwd);
send(clientSocket, cwd, strlen(cwd), 0);
Ini berhasil untuk saya.
char
penuh, termasuk sampah setelah byte NUL. Cobasend(clientSocket, cwd, strlen(cwd) + 1, 0);
- person Steve Friedl   schedule 24.12.2019clientSocket
. - person Andrii   schedule 24.12.2019