如何在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;
}
}
}