Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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

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
C 测试非阻塞UDP套接字时中止进程_C_Sockets_Memory_Memory Management_Asyncsocket - Fatal编程技术网

C 测试非阻塞UDP套接字时中止进程

C 测试非阻塞UDP套接字时中止进程,c,sockets,memory,memory-management,asyncsocket,C,Sockets,Memory,Memory Management,Asyncsocket,我正在构建一个非阻塞UDP套接字客户机/服务器对。概要是客户端通过流量整形器向服务器发送一个txt文件,服务器接收并将接收到的内容写入一个文件,然后以/格式发回一个“ACK”。我要发送的文件是1048576字节,全部压缩为string.txt您将在下面看到。我还将文件划分为每个1024字节的数据包(1024个数据包),并为发送/接收过程计时。现在,我遇到了一个问题。我试着发送一个相对较小的2048字节的文件(2个数据包),一切正常。然而,当我试图发送这个巨大的文件时,我得到了一个损坏的\u大小v

我正在构建一个非阻塞UDP套接字客户机/服务器对。概要是客户端通过流量整形器向服务器发送一个txt文件,服务器接收并将接收到的内容写入一个文件,然后以
/
格式发回一个“ACK”。我要发送的文件是1048576字节,全部压缩为
string.txt
您将在下面看到。我还将文件划分为每个1024字节的数据包(1024个数据包),并为发送/接收过程计时。现在,我遇到了一个问题。我试着发送一个相对较小的2048字节的文件(2个数据包),一切正常。然而,当我试图发送这个巨大的文件时,我得到了一个
损坏的\u大小vs.prev\u大小
错误。请参阅下面的完整错误。我知道这是一个巨大的飞跃,但我希望它仍然能够工作。一个关键点:我不需要每一个包都到达。我只需要一个没有内存错误的相当大的量。我已经试着调试了所有我能调试的东西,但是没有用。我不能纠正那个愚蠢的错误。我正在运行Linux Ubuntu 16.04 BTW

谢谢

服务器:

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义ITOA_基(sizeof(无符号)*字符位+2)
无效错误(常量字符*消息,常量字符*详细信息);
void PrintSocketAddress(const struct sockaddr*地址,文件*流);
void SIGIOHandler(int signalType);
字符*itoa_基(字符*s,整数x,整数基);
#定义ITOA(x,b)ITOA_基((char[ITOA_基N]){0},(x),(b))
int sock、run、acknum、maxpack;//信号处理器的全局
int main(int argc,char*argv[]){
如果(argc!=5)
错误(“参数)”,“”);
servAddr中的结构sockaddr_;
in_port_t service=atoi(argv[1]);
acknum=atoi(argv[2]);
maxpack=atoi(argv[3]);
int trials=atoi(argv[4]);//必须与客户协调
run=0;
sock=插座(AF_INET、sock_DGRAM、IPPROTO_UDP);
if(sock<0)
错误(“socket()失败了”,“”);
memset(&servAddr,0,sizeof(servAddr));
servAddr.sin_family=AF_INET;
servAddr.sin\u addr.s\u addr=htonl(INADDR\u ANY);
servAddr.sinu port=htons(服务);
if(bind(sock,(struct sockaddr*)&servAddr,sizeof(servAddr))<0
错误(“bind()失败了”,“”);
结构sigaction处理程序;
handler.sa_handler=SIGIOHandler;
if(sigfillset(&handler.sa_mask)<0)
错误(“sigfillset()失败”,“未设置掩码”);
handler.sa_标志=0;
if(sigaction(SIGIO,&handler,0)<0)
错误(“sigaction()失败”,“无法修改SIGIO行为”);
如果(fcntl(sock、F_SETOWN、getpid())<0)
错误(“无法将进程所有者设置为我们”,“”);
如果(fcntl(sock、F_SETFL、O_NONBLOCK | FASYNC)<0)
错误(
“无法将客户端sock置于非阻塞/异步模式”,“”);
对于(;;){
如果(运行==试验){
关闭(袜子);
出口(0);
}
printf(“.”);
fflush(stdout);
睡眠(1);
}
}
无效错误(常量字符*消息,常量字符*详细信息){
FPUT(味精、标准物质);
如果(*详细信息!='\0'){
FPUT(“:”,标准);
FPUT(详图,标准);
}
fputc('\n',stderr);
出口(1);
}
void SIGIOHandler(int signalType){
printf(“\n”);
fclose(fopen(“output.txt”、“wb”);
clntAddr中的结构sockaddr_;
socklen_t clntern=sizeof(clntAddr);
使用数字单位;
int=0;
文件*fp=fopen(“output.txt”、“ab”);
如果(fp==NULL)
错误(“打开文件时出错”,”;
字符缓冲区[maxpack];
char*output=malloc(maxpack*sizeof(char));
if(输出==NULL)
错误(“malloc()失败”,“”);
memset(buffer,0,sizeof(buffer));
memset(输出,0,sizeof(输出));
做{
numBytes=recvfrom(sock、buffer、maxpack、0、(struct sockaddr*)和clntAddr、&clntren);
如果(单位<0){
if(errno!=ewoldblock)//只有可接受的错误
错误(“recvfrom()失败”,“失败”);
}否则{
数据包+=1;
如果(数据包!=1){
输出=realloc(输出,maxpack*数据包*sizeof(char));
if(输出==NULL)
错误(“realloc()失败”,“错误”);
}
memmove(输出+maxpack*(数据包-1)、缓冲区、strlen(缓冲区));
fprintf(标准术语“经办客户”);
PrintSocketAddress((struct sockaddr*)&clntAddr,stdout);
fprintf(标准输出,“\n\t%s\n”,缓冲区);
}
}而(numBytes>=0);
运行+=1;
输出[strlen(输出)-1]=0;
fprintf(fp,“%s”,输出);
fclose(fp);
自由(输出);
char*ack=ITOA(运行,10);
char*append=ITOA(数据包,10);
strcat(ack,“/”;
strcat(ack,append);
for(int i=0;i=2和基数7))
错误(“参数)”,“[]”;
char*server=argv[1];
文件*fp=fopen(argv[2],“rb”);
如果(fp==NULL)
错误(“打开文件时出错”,”;
fseek(fp,-1,SEEK_END);
无符号长字符串=(getc(fp)='\n'?(ftell(fp)-1:ftell(fp));
倒带(fp);
char*string=malloc(stringlen*sizeof(char));
对于(int i=0;i