小弟写了一个小程序,发现了一些问题,想各位请教
server.c
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
int main()
{
struct sockaddr_in serveraddr;
struct sockaddr_in clientaddr;
int listen_fd,connect_fd;
int len;
char data_rec[1024];
char data_send[1024]="OK";
int read_count;
int nwritten;
listen_fd = socket(AF_INET,SOCK_STREAM,0);
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family= AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(atol("54321"));
bind(listen_fd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
if (listen(listen_fd,5)<0)
{
printf("Listen error
");
return -1;
}
while(1)
{
printf("listening....
");
connect_fd = accept(listen_fd,(struct sockaddr*)&clientaddr,&len);
if (connect_fd<0)
{
perror("Error accept");
}
read_count= read(connect_fd,data_rec,sizeof(data_rec)) ;
printf("read_count %d
",read_count);
while (read_count>0)
{
read_count= read(connect_fd,data_rec,sizeof(data_rec)) ;
printf("read_count %d
",read_count);
}
nwritten = write(connect_fd,data_send,3);
printf("write successful
");
close(connect_fd);
}
}
client.c
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
int main()
{
struct sockaddr_in serveraddr;
int fd;
int connect_fd;
char data[100]="123";
char read1[100];
fd = socket(AF_INET,SOCK_STREAM,0);
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family= AF_INET;
inet_aton("192.168.1.188",&serveraddr.sin_addr);
serveraddr.sin_port = htons(atol("54321"));
connect_fd = connect(fd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
printf("%d
",connect_fd);
if (connect_fd<0)
{
perror("connect");
exit(-1);
}
int nwriten;
nwriten = write(fd,data,4);
printf("nwriten %d
",nwriten);
//while (nwriten>0)
// {
// nwriten = write(fd,data,10);
// printf("nwriten %d
",nwriten);
// }
printf("write successful!
");
int nread;
nread=read(fd,read1,5);
printf("nread %d
",nread);
//while (nread!=0)
//{
// nread=read(fd,read1,1);
// printf("read %s
",read1);
//}
//close(fd);
}
那么运行的结果是 server第一次能读到 client发来的4个字节,
read_count= read(connect_fd,data_rec,sizeof(data_rec)) ;
即read_count=4,由于read_count>0,将执行while(read_count>0)下面的循环
while (read_count>0)
{
read_count= read(connect_fd,data_rec,sizeof(data_rec)) ;
printf("read_count %d
",read_count);
}
结果server就阻塞在循环里面的read_count= read(connect_fd,data_rec,sizeof(data_rec)) ;
而对于client,则阻塞在nread=read(fd,read1,5)。
即服务器和客户端都阻塞在 read函数。
我不明白的地方在于,对于server来说,第一次读到发来的4个字节,然后下一次再调用read的时候,不应该返回0,表示没有数据可读,为什么还要阻塞呢。 这里采取多次读只到返回0的方式是 STEVEN的UNP中 的64页的方法啊。
兄弟们指点一下啊
|
|