这是服务器端的方法:
void send_err(int socket_fd, char *msg) {
/// To send an error message (`ERR`).
size_t len = strlen(msg);
printf("send_err: msg='%s' of size:%zu\n", msg, len);
INIT_HEAD_S(head_s, ERR, len);
send_header(socket_fd, &head_s, sizeof(cmd_header_t));
send_msg(socket_fd, msg, len * sizeof(char));
}
我这样调用该方法:send_err(socket_fd, "»»»»»»»»» illogical REQ request.\0");
套接字已正确设置,并且send_header
和send_args
方法可以正常工作。
在服务器端,printf
可以正常工作,但是strlen
不能返回正确的值(它应该是33
,但是它给出了{{1} })。
在客户端,接收到的消息是不确定的:有时还会出现奇怪的额外字符。显然,手动添加43
似乎并没有在我的字符串末尾添加NUL字符。
我应该怎么做? 我希望该方法不要求对方计算发送的字符数,因为这样做很烦人。
答案 0 :(得分:4)
void send_err(int socket_fd, char *msg) {
/// To send an error message (`ERR`).
size_t len = strlen(msg)+1; // because `strlen` doesn't include the NUL char
printf("send_err: msg='%s' of size:%zu\n", msg, len);
INIT_HEAD_S(head_s, ERR, len);
send_header(socket_fd, &head_s, sizeof(cmd_header_t));
send_msg(socket_fd, msg, len * sizeof(char));
}
正如Alex F在评论中所建议的那样,我的错误在于操纵strlen
。我只需要添加一个+1
。