linux c 重复运行,Linux Socket recv send 重复多次接受发送解决办法

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)) {

...

楼主再查查资料吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值