Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在linux套接字中逐块发送和接收数据 void发送数据(int sockfd,char*data) { int n,i=0; int SIZE=strlen(数据); int size=0; 而(1) { 如果(大小>限制) { 大小=限制; }否则{ 大小=大小; } 尺寸-=限制; 如果(SIZE_C_Sockets - Fatal编程技术网

如何在linux套接字中逐块发送和接收数据 void发送数据(int sockfd,char*data) { int n,i=0; int SIZE=strlen(数据); int size=0; 而(1) { 如果(大小>限制) { 大小=限制; }否则{ 大小=大小; } 尺寸-=限制; 如果(SIZE

如何在linux套接字中逐块发送和接收数据 void发送数据(int sockfd,char*data) { int n,i=0; int SIZE=strlen(数据); int size=0; 而(1) { 如果(大小>限制) { 大小=限制; }否则{ 大小=大小; } 尺寸-=限制; 如果(SIZE,c,sockets,C,Sockets,首先,您的两个函数比需要的复杂一点。它们可以简化 例如,send\u data()中的整个SIZE和LIMIT处理可以删除,因为您直接发送数据缓冲区,所以只需给出send()中的字节数,让send()告诉您它实际接受了多少字节 但更重要的是,receive_data()需要考虑输入缓冲区的大小。您只是盲目地读取,而不知道实际发送了多少数据。您正在将一个可变长度的字符串传递给send_data(),这很容易超过接收数据()的调用方所期望的缓冲区大小 此外,您根本不需要任何错误处理 请尝试类似以下内

首先,您的两个函数比需要的复杂一点。它们可以简化

例如,
send\u data()
中的整个
SIZE
LIMIT
处理可以删除,因为您直接发送
数据
缓冲区,所以只需给出
send()
中的字节数,让
send()
告诉您它实际接受了多少字节

但更重要的是,
receive_data()
需要考虑输入
缓冲区的大小。您只是盲目地读取,而不知道实际发送了多少数据。您正在将一个可变长度的字符串传递给
send_data()
,这很容易超过
接收数据()的调用方所期望的
缓冲区大小

此外,您根本不需要任何错误处理

请尝试类似以下内容:

int发送数据(int sockfd,const void*buffer,size\t bufsize)
{
常量字符*pbuffer=(常量字符*)缓冲区;
而(bufsize>0)
{
int n=发送(sockfd、pbuffer、bufsize、0);
如果(n<0)返回-1;
pbuffer+=n;
bufsize-=n;
}
返回0;
}
int接收数据(int sockfd、void*缓冲区、大小bufsize)
{
char*pbuffer=(char*)缓冲区;
而(bufsize>0)
{
int n=recv(sockfd,pbuffer,bufsize,0);

如果(n)要发送/接收长度超过一个字节的消息,您需要TCP之上的协议。您还必须正确、完整地处理从系统调用(如recv()返回的结果)。您使用的是UDP还是TCP套接字?显示a。我使用TCP/IP套接字请注意,TCP不是面向数据报的。这意味着接收方无法知道发送方发送了多少字节(除非长度在数据本身或过程中)。要发送的呼叫数与对recv的呼叫数之间没有关系。发送限制没有问题。在有数据空间之前,发送将被阻止(除非您将套接字设置为非阻止模式)。TCP是一个“窗口”可靠的协议。数据通过具有CRC的数据包发送,每个数据包都必须由接收方确认。但在发送方停止发送并等待确认之前,可以发送大量尚未确认的数据包。如果缺少ACK或NAK(接收方检测到数据损坏),则会重新发送数据包。
void send_data(int sockfd, char *data)
{
    int n, i = 0;
    int SIZE = strlen(data);
    int size = 0;
    while (1)
    {
        if (SIZE > LIMIT)
        {
            size = LIMIT;
        }else{
            size = SIZE;
        }
        SIZE -= LIMIT;

        if (SIZE <= 0){
            break;
        }
        send(sockfd, data + i, LIMIT, 0);
        i += LIMIT;
    }
}

void receive_data(int sockfd, char *buffer)
{
    int n;
    int i = 0;
    while (1)
    {
        n = recv(sockfd, buffer + i, 256, 0);
        i+=n;
        if (n < 0)
        {
            break;
        }
    }
}