- 论坛徽章:
- 1
|
本帖最后由 mrpre 于 2014-06-11 12:54 编辑
最简单不过的select,不知道为什么总是运行结果不是想象中的那样。
客户端:- if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)
- {
- perror("connect error\n");
- return 1;
- }
-
- printf("connect sucess\n");
-
- if (send(sockfd, msg,strlen(msg), 0) == -1)
- {
- printf("send error\n");
- return 1;
- }
-
- printf("send sucess\n");
-
- while(1)
- {
- FD_ZERO(&readfd);
- FD_SET(sockfd,&readfd);
- if(select(sockfd+1,&readfd,NULL,NULL,NULL) > 0)
- {
- if(FD_ISSET(sockfd,&readfd))
- {
- if ((recvbytes = recv(sockfd, buf, MAXDATASIZE, 0)) ==-1)
- {
- perror("recv Error!\n");
- return 1;
- }
- else
- {
- [b]printf("recv sucess:%s\n",buf);[/b]
- memset(buf,0,sizeof(buf));
- }
- }
- }
- }
- close(sockfd);
复制代码 服务器:- while(1)
- {
- /* 服务器阻塞,直到客户程序建立连接 */
- printf("ready to accept\n");
- int sin_size = sizeof(struct sockaddr_in);
- if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)
- {
- //accept()函数让服务器接收客户的连接请求
- perror("accept Error\n");
- continue;
- }
-
- printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr)); //inet_ntoa(将网络二进制的数字转换成网络地址)
- if ((recvbytes=recv(client_fd, buf, MAXDATASIZE, 0)) ==-1)
- {
- perror("recv Error!\n");
- return 1;
- }
-
- buf[recvbytes] = '\0';
- printf("Received: %s\n",buf);
-
- if(-1 == send(client_fd,"i have received",strlen("i have received"),0))
- {
- perror("send error\n");
- return 1;
- }
- [b]close(client_fd);[b]
- }
- close(sockfd);
复制代码 当服务器加粗的语句(倒数第三行代码:close(client_fd)保留的时候:
客户端一直会打印printf("recv sucess:%s\n",buf),当然,除了第一次buf里面有数据之后,其他的结果buf都打不出数据。且不说为什么recv阻塞不阻塞
客户端的if(select(sockfd+1,&readfd,NULL,NULL,NULL) > 0)
为什么判断总是成立?服务器的的确确只发了一次数据。
当服务器加粗的语句(倒数第三行代码:close(client_fd)去除的时候:
即close(client_fd);注释掉的时候,客户端压根就没有进if(select(sockfd+1,&readfd,NULL,NULL,NULL) > 0)
可是服务器的的确确发送数据了。
可运行程序.rar
(1.81 KB, 下载次数: 8)
|
|