gpt4 book ai didi

c - 在 C 中使用套接字在 TCP 传输中丢失数据

转载 作者:可可西里 更新时间:2023-11-01 16:57:18 26 4
gpt4 key购买 nike

我正在下载一个 200 字符 block 的在线 .dat 文件,并且丢失了一些数据。大多数但不是所有 block 都完全下载,但有些 block 只下载了一部分,当我将接收到的数据直接打印到本地文本文件时,缺少字符。

谢谢。

我正在使用的程序如下。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netdb.h>
#include <string.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <malloc.h>

#define NOT_EOF 1
#define REACHED_EOF 0
#define BUFFER_SIZE 200

struct sockaddr_storage their_addr;
socklen_t addr_size;
char inputData[200];
int newsocket;
struct timeval timeout;
char sendStr[100];
char method[] = "GET";

char *buffer= (char *)malloc(2*BUFFER_SIZE*sizeof(char));

FILE *testdata=fopen("testRecv.txt","w");

struct addrinfo hints, *result;
memset (&hints, 0, sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;

if(getaddrinfo("www.blahblah.com","80"
, &hints, &result)!=0)
{
freeaddrinfo(result);
puts("Unable to resolve hostname.");
exit(1);
}

newsocket = socket( result->ai_family, result->ai_socktype, 0);
if(newsocket == FAILURE)
{
puts("Unable to create socket.");
freeaddrinfo(result);
close(newsocket);
exit(1);
}

memset(&timeout, 0, sizeof(timeout));
timeout.tv_sec= 10;
timeout.tv_usec= 0;
setsockopt(newsocket, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
setsockopt(newsocket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));

if(connect(newsocket, result->ai_addr, result->ai_addrlen) == -1)
{
puts("Could not connect.");
freeaddrinfo(result);
close(newsocket);
exit(1);
}

strcpy(sendStr,method);
strcat(sendStr," /");
strcat(sendStr,subdomain);
strcat(sendStr," HTTP/1.0\r\nHost: ");
strcat(sendStr,hostname);
strcat(sendStr,"\r\n\r\n");

if( send(newsocket,sendStr,strlen(sendStr),0) == FAILURE)
printf("Unable to send message\n");

while(not_eof=NOT_EOF)
{
bytes_recieved=recv(newsocket,buffer,BUFFER_SIZE,0);

fprintf(testdata,"%s",buffer);

if(bytes_recieved == 0 || *(buffer+bytes_recieved) == EOF)
not_eof=REACHED_EOF;
}

最佳答案

你不能只调用一次recv。由于您处于阻塞模式,因此必须在循环中调用它并检查其返回值是否为正。如果它是负数,则有一个错误,如果它是零,则套接字已有序关闭。

关于c - 在 C 中使用套接字在 TCP 传输中丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8328839/

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