【发布时间】:2015-05-31 07:44:09
【问题描述】:
write()在写入大数据后没有得到响应。在一个套接字上写入是否有任何限制?还是受操作系统限制?(我在 ubuntu 上运行)
我自己的代码适用于低于1kb with (5 byte per write, little write number) 或(1Mb per write, 1 write ) 尝试的小文件。但该代码不适用于有关3Mb with (5 byte per write, a lot of write) 或(1Mb per write, 3 write) 尝试的大文件。
比如3M file with 1Mb per write的情况,第三次写永远被阻塞,不能得到返回值。
下面是我自己的代码。从stdin 输入并将其写入服务器。 lprintf,l2printf 只是'log printf'。
int BSIZE = 1024;
//int BSIZE = 5;
char buffer[BSIZE];
int n = 0;
//phase 2-1 write
//read from outter
int bi =0;
int c;
int temp= 0;
int t2 =0;
while (EOF!=(c = fgetc(stdin))) {
if(temp++%(1024*1024) == 0){
l2printf("over 1m\n");
t2++;
if (t2 == 2){
//loglevel=1;
}
}
/*
if(temp++ > 3500){
printf("\ntemp 3500\n")
break;
}
*/
lprintf("|");
lprintf("%x",c & 0xff);
if(c =='\\'){
char input[2] = "\\\\";
lprintf("%x",input[0] & 0xff);
buffer[bi++] = '\\';
if(bi == sizeof(buffer)){
lprintf("\n");
l2printf ("\nB/1:%x\n", buffer[1]);
n = write(sockfd,buffer,sizeof(buffer));
bi = 0;
}
buffer[bi++] = '\\';
if(bi == sizeof(buffer)){
lprintf("\n");
l2printf ("\nB/2:%x\n", buffer[1]);
n = write(sockfd,buffer,sizeof(buffer));
bi = 0;
}
//n = write(sockfd,input,sizeof(char)*2);
}
else{
buffer[bi++] = c;
if(bi == sizeof(buffer)){
lprintf("\n");
l2printf ("\nBc:%x\n", buffer);
n = write(sockfd,buffer,sizeof(buffer));
l2printf("n = %d \n", n);
bi = 0;
}
//n = write(sockfd,&c,sizeof(char));
//lprintf("%c",c);
}
if( n <0 ){
error("ERROR writing to socket 2-1");
}
}
//adding EOF
//clear buffer
lprintf("\n");
l2printf ("\nEB:%x\n", buffer);
n = write(sockfd,buffer,sizeof(char)*bi);
char input[2] = "\\0";
n = write(sockfd,input,sizeof(char)*2);
lprintf("*\\0*");
if( n <0 ){
error("ERROR writing to socket 2-1 EOF");
}
【问题讨论】:
-
另一端是否在读取数据?
-
@EdHeal 上面的代码是client.c。实际上我通过'client.c
-
@EdHeal 正在向您询问另一端的情况。服务器。
-
使用
write()而不是send()用于套接字看起来很奇怪,有人知道除了标志中隐含的0之外是否有区别? -
@Havenard 没有区别。
write(sd,buffer,length)等价于send(sd,buffer,length,0);