gpt4 book ai didi

c - fwrite 没有在缓冲区中发送我想要的内容

转载 作者:行者123 更新时间:2023-11-30 15:33:20 24 4
gpt4 key购买 nike

我试图使其在用户键入“L”时运行 LIST 命令并显示所有可供下载的文件,但是当我运行它时,键入 L 后,程序会打印出“eetings”。我认为我没有正确使用 recv()、send() 或 fwrite() 命令,我是否遗漏了什么?当我输入时进一步注意

ncat 65.19.178.177 1234

在命令行中,它打印出“+OK Greetings”,但是当我在程序中输入“L”时,它打印出“eetings”,所以我认为它以某种方式从中获取。

void menu()
{
printf("L) List files\n");
printf("D) Download a file\n");
printf("Q) Quit\n");
}

int main(int argc, char **argv)
{
struct sockaddr_in sa;
int sockfd;

sa.sin_family = AF_INET;
sa.sin_port = htons(1234);
inet_pton(AF_INET,"65.19.178.177", &sa.sin_addr);

sockfd = socket(PF_INET,SOCK_STREAM, IPPROTO_TCP);
if (sockfd == -1)
{
fprintf(stderr, "Can't create socket\n");
exit(3);
}

int res = connect(sockfd, (struct sockaddr *)&sa, sizeof(sa));
if (res == -1)
{
fprintf(stderr, "can't connect\n");
exit(2);
}

char buff[1000];
size_t rsize;
int resultcode;

//Get treeting from server. Expecting 220
rsize = recv(sockfd, buff, 1000, 0);
sscanf(buff, "%d", &resultcode);

if (buff[0]=='+')
{
printf("Success\n");
}
else
{
printf("Failed: Didn't get 220\n");
}

while(1)
{
menu();
char *choice = readline("Choice: ");

switch(choice[0])
{
case 'l':
case 'L':
//Handle L case
sprintf(buff, "LIST");
send(sockfd, buff, strlen(buff), 0);
while ((rsize = recv(sockfd, buff, 1000, 0)) > 0)
{
fwrite(buff, rsize, 1, stdout);
}
close(sockfd);
break;

最佳答案

也许这就是正在发生的事情(我认为这就是@Martin James 的意思):

在最初的 recv() 中,您不会检查 rsize 的值,但如果 buff[0] == '+' 之后。但你无法确定通过一次 recv() 调用是否收到了完整的问候语,也许只是 "+OK Gr" 而其余的仍然是等待接收。

现在您发送命令,但在收到命令结果之前,您将收到初始消息的其余部分,即“eetings”

你应该这样做:

int received = 0;
int expected = strlen( "+OK Greetings" );

rsize = recv(sockfd, buff, 1000, 0);
if( resize <= 0 || buff[0] != '+' ) {
// do some error handling and exit
..
}
received = rsize;
while( received < expected ) {
rsize = recv(sockfd, buff+received, 1000-received, 0);
if( resize <= 0 ) {
// do some error handling and exit
..
}
received += rsize;
}

调用 sscanf() 对我来说没有意义,因为根据您的问题,您没有收到数值。这是正确的吗?

附注:如果您无法访问“真正的调试器”,您可以随时在代码中添加一些 printf() 语句来查看发生了什么,就像:

rsize = recv(sockfd, buff, 1000, 0);
printf( "recv() returns %d\n", rsize );

关于c - fwrite 没有在缓冲区中发送我想要的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23764808/

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