นี่คือรหัสของฉัน:
#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;
มันไม่ได้เปลี่ยนแปลงอะไรเลย
การคาดเดาที่ดีที่สุดของฉันคือข้อมูลระหว่างเส้นทางจริงและจุดสิ้นสุดที่เป็นโมฆะคือสิ่งที่ทำให้เกิดข้อผิดพลาดในการเข้ารหัสที่จุดสิ้นสุดของสคริปต์หลาม แต่ฉันไม่สามารถจัดสรรหน่วยความจำเพียงพอสำหรับเส้นทางได้เนื่องจากฉันไม่สามารถทราบความยาวของเส้นทางก่อนที่จะจัดสรร หน่วยความจำ ดังนั้นฉันจึงเลือก 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