gpt4 book ai didi

c - read() 函数中的随机空字符

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:46 25 4
gpt4 key购买 nike

我正在用 TCP 构建一个基本的客户端和服务器。它工作正常,除非 key 变得有点大。它只是来回发送 key ,直到时间结束。当它变大(又名 4096)时,read() 语句将随机获得一个空值,然后将 key 分成两个消息,然后打破循环。

我真的不确定为什么要这样做,服务器代码正在运行,因为它已经与其他客户端一起测试过,所以我的客户端有问题。任何想法(很短):

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

#define BUFFER_LENGTH 5120

// Error message taken from reference
void error(const char *msg)
{
printf("%s\n", msg);
exit(0);
}
int main(int argc, char *argv[])
{
int sockfd, portNumber, n;
struct sockaddr_in serv_addr;
struct hostent *server;

// Invalid arguments
if (argc < 4)
exit(0);
else if (atoi(argv[3]) < 1 || atoi(argv[3]) > 4096)
exit(0);

char buffer[BUFFER_LENGTH];
bzero(buffer, BUFFER_LENGTH);
char buffer2[BUFFER_LENGTH];
bzero(buffer2, BUFFER_LENGTH);
strcpy(buffer2, "Connect. Key length: ");
strcpy(buffer, strcat(buffer2, argv[3]));
portNumber = atoi(argv[2]); // Get port number in int format
sockfd = socket(AF_INET, SOCK_STREAM, 0); // Create socket connection to server using internet constants

// Did we open the socket succesfully?
if (sockfd < 0)
error("Error opening socket.");

// Is the IP Address valid?
server = gethostbyname(argv[1]);
if (server == NULL)
error("Could not connect to server. Terminating.");

// Initialize to zero and then set
// Taken from reference
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portNumber);
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
error("Could not connect to server. Terminating.");

short connected = 1;
do
{
// Send initial request on first pass
// Afterwards send the resposne we were given
printf("Sending: %s\n", buffer);
printf("Length of msg: %d\n", (strlen(buffer) + 1));
n = write(sockfd, buffer, strlen(buffer) + 1);
if (n < 1)
error("Failed to send Message. Terminating.");

// Get session key response
bzero(buffer, BUFFER_LENGTH);
n = read(sockfd, buffer, BUFFER_LENGTH);
if (n < 1)
error("Could not fetch result. Terminating.");

// Stop
if (strcmp(buffer, "Invalid session key. Terminating.") == 0)
break;

printf("%s\n", buffer);
sleep(1);
} while (connected == 1);

// Done (this should never be reached in this client)
error("Could not fetch result. Terminating.");
close(sockfd);
return 0;
}

最佳答案

不要对二进制数据使用 strcpy() 或任何 str*() 函数。你不是在处理字符串。使用 memcpy() 并指定要复制的字节数。

str*() 函数对字符串 进行操作; C 标准将字符串定义为“由第一个空字符终止并包括第一个空字符的连续字符序列”。但在二进制数据中,空字符(零字节)只是另一 block 数据,不一定具有任何意义。

如果您的二进制数据如下所示(十六进制):

4b d9 e7 b3 00 96 89 fb

然后 strcpy() 将忽略 00 字节之后的所有内容。更糟糕的是,如果您的二进制数据如下所示:

4b d9 e7 b3 2f 96 89 fb

没有 空字节,然后是strcpy(),或strlen(),或任何字符串函数将在你的结束后继续缓冲区,结果不可预测。

关于c - read() 函数中的随机空字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12887073/

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