gpt4 book ai didi

C-SERVER - 在 : strncpy(ii2, iii + 5, 3) 的奇怪行为;

转载 作者:行者123 更新时间:2023-12-02 08:15:38 25 4
gpt4 key购买 nike

让我们向 C-SERVER 发送一条消息:

echo '1234567890' | nc <ip> <port>

C-SERVER 打印:(oo.ooo.o = 客户端的部分 IP)

678oo.ooo.o---

但我只要求它从收到的消息中打印3 个字符
(从第 5 个字符开始)

strncpy(ii2, iii + 5, 3);

它应该只打印:(加上 --- )

 678

问题:为什么将客户端的部分IP地址附加到上面的字符串?

额外信息:

当我一起删除这一行时,问题似乎就消失了:

snprintf(iip, 15, "%s", inet_ntoa(cli_addr.sin_addr));

但我不想删除该行。

完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <err.h>
#include <string.h>

char * nnn;
char iii [500];
char ii2 [3];
char iip [15];


int main()
{
int one = 1, client_fd;
struct sockaddr_in svr_addr, cli_addr;
socklen_t sin_len = sizeof(cli_addr);

int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0)
err(1, "can't open socket");

setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int));

int port = 86;
svr_addr.sin_family = AF_INET;
svr_addr.sin_addr.s_addr = INADDR_ANY;
svr_addr.sin_port = htons(port);

if (bind(sock, (struct sockaddr *) &svr_addr, sizeof(svr_addr)) == -1) {
close(sock);
err(1, "Can't bind");
}

listen(sock, 5);
while (1) {
client_fd = accept(sock, (struct sockaddr *) &cli_addr, &sin_len);
snprintf(iip, 15, "%s", inet_ntoa(cli_addr.sin_addr));
ssize_t t = read(client_fd,iii,500);

if ( t > 0 ) { iii[ t ] = '\0'; ii2[ t ] = '\0'; }

strncpy(ii2, iii + 5, 3);

printf(ii2);
printf("---");
printf("\n");
asprintf(&nnn, "%s\n", ii2);


write(client_fd, nnn, strlen(nnn));
close(client_fd);
}
}

最佳答案

您错误地使用了 strncpy。此函数设计用于固定长度的字符串 - 现在很少使用。

该函数将三个字符复制到 ii2 中,但不添加空终止符。将调用替换为对 memcpy 的调用,并在最后一个字符中设置 '\0',如下所示:

char ii2 [4]; // <<== 3 plus 1 for '\0'
...
memcpy(ii2, iii + 5, 3);
ii2[3] = '\0';

请注意,如果您只需要从可能更长的字符串中打印三个字符,则不需要 ii2。您可以使用 %.3s 格式说明符,如下所示:

asprintf(&nnn, "%.3s\n", iii+5);

您需要调用 free(nnn) 以避免造成内存泄漏。此外,由于结果的大小限制为 5,您可以将 asprintf 调用替换为 sprintf 以固定大小的缓冲区。

关于C-SERVER - 在 : strncpy(ii2, iii + 5, 3) 的奇怪行为;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42327758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com