Linux Socket recv send 重复多次接受发送
敲了一下linux程序设计上的例子,多客户/服务器的例子
我测试的时候用一个客户端发送‘A' 然后服务器接收后向客户端发送'B' (客户端 服务器端都是我的虚拟机)
可是我发现服务器在发送‘B'之后 还会再发送两次,求大神指教这是为什么?
代码如下
服务端 server5.c
int main(int argc,char *argv[])
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
memset(&server_address,0,sizeof(server_address));
memset(&client_address,0,sizeof(client_address));
int result;
fd_set readfds, testfds;
int maxfd;
//define a server socket --> bind -- >listen
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
//bind
server_address.sin_family = AF_INET;
server_address.sin_port = htons(8888);
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
bind(server_sockfd,(struct sockaddr *)&server_address,sizeof(server_address));
//listen
listen(server_sockfd,5);
//set fd_set
FD_ZERO(&readfds);
FD_SET(server_sockfd,&readfds);
maxfd = server_sockfd + 1;
while(1)
{
char ch;
int fd,i;
int nread;
testfds = readfds;
printf("server waiting...\n");
result = select(FD_SETSIZE, &testfds, NULL, NULL, NULL);
if(result
{
printf("server5\n");
exit(EXIT_FAILURE);
}
for( fd = 0; fd
{
if(FD_ISSET(fd,&testfds))
{
if(fd == server_sockfd)
{
memset(&client_address,0,sizeof(client_address));
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
maxfd = (maxfd > client_sockfd)?maxfd:client_sockfd+1;
FD_SET(client_sockfd,&readfds);
printf("adding client on fd %d\n\n",client_sockfd);
}
else
{
printf("fd %d\n",fd);
recv(fd,&ch,1,0);
printf("recv from client : %c\n",ch);
sleep(5);
ch++;
send(fd,&ch,1,0);
printf("send to client : %c\n\n",ch);
}
}
}
}
}
客户端 client3.c
int main(int argc,char *argv[])
{
int sockfd;
int len;
struct sockaddr_in address;
memset(&address,0,sizeof(address));
int result;
char ch = 'A';
sockfd = socket(AF_INET,SOCK_STREAM,0);
address.sin_family = AF_INET;
address.sin_port = htons(8888);
address.sin_addr.s_addr = inet_addr("127.0.0.1");
len = sizeof(address);
connect(sockfd,(struct sockaddr *)&address,len);
write(sockfd,&ch,1);
read(sockfd,&ch,1);
printf("char from server = %c \n",ch);
close(sockfd);
return 0;
}
运行结果
客户端
lyj@ubuntu:~/linux/20150528$ ./client
char from server = B
lyj@ubuntu:~/linux/20150528$
服务器端
lyj@ubuntu:~/linux/20150528$ ./server
server waiting...
adding client on fd 4
server waiting...
fd 4
recv from client : A
send to client : B
(怎样才能让下面的不发送呢?)
server waiting...
fd 4
recv from client : B
send to client : C
server waiting...
fd 4
recv from client : C
lyj@ubuntu:~/linux/20150528$
------解决思路----------------------
为什么会多"发送"两次产生的原因简单,但要说明这个过程有点复杂。
要知道 stdin stdout stderr 的 fd 是 0 1 2
而代码中有 for( fd = 0; fd
.... ...
楼主搞错了几处
1) 搞错 select 的参数
select(FD_SETSIZE, &testfds, NULL, NULL, NULL);
这个 FD_SETSIZE 应该是 maxfd, 这个参数是说明在 FD_SET 中的 fd 的范围, 而不是个数
2) 搞错 fd
应该有一个记录所有 fd 的数组...每当有新的 fd ,就把fd 记录到数组中, fd 个数++ 如
fds[MAX_NUM];
fd_count; // fd 个数统计
select(maxfd, &testfds, NULL, NULL, NULL);
for( i = 0; i
if(FD_ISSET(fds[i],&testfds)) {
...
楼主再查查资料吧