【发布时间】:2020-04-15 17:00:37
【问题描述】:
这是我的代码:
#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
每当我在 C 程序上打印 cwd 时,它都会毫无问题地打印出来。 我试过用 null 来终止这样的字符串:
cwd[strlen(cwd)] = 0;
它没有改变任何东西。
我最好的猜测是实际路径和空终止符之间的数据是导致 python 脚本端编码错误的原因,但我无法为路径分配足够的内存,因为我不知道分配内存之前的路径,所以我选择了 1024,因为我觉得这是一个合理的值。
有人知道我该如何解决这个问题吗?
编辑: 我解决了。由于缓冲区大小 (1024) 较大,cwd 字符串与实际字符串一起包含大量垃圾。我设法为 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); -
现在它给了我这个错误:ConnectionResetError: [Errno 104] Connection reset by peer
-
连接重置是来自 python 程序(如我所料),还是来自 C 中的发送程序?
-
你应该close
clientSocket。
标签: python c sockets encoding winsock2