主题 : 接收了客户端的信息   再把客户端信息发回    发回数据会丢失?? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 63206
精华: 0
发帖: 13
金钱: 65 两
威望: 13 点
综合积分: 26 分
注册时间: 2012-02-16
最后登录: 2012-03-09
楼主  发表于: 2012-03-02 16:05

 接收了客户端的信息   再把客户端信息发回    发回数据会丢失??

请教     ?????把接收在缓冲区的数据发回客户端  数据丢失??????
typedef struct cli_node
{
        int clifd;
        struct cli_node *next;
} cli_node, *cli_list;
cli_list add_cli(cli_list head, int fd)
{
        cli_list p = head;

        cli_list new_cli = (cli_list) malloc(sizeof(cli_node));

        while (p->next)
                p = p->next;
        new_cli->clifd = fd;
        new_cli->next = NULL;
        p->next = new_cli;
        return (head);
}
cli_list delete_cli(cli_list head, int fd)
{
        cli_list p = head, q = head->next;

        while (q->clifd != fd) {
                p = q;
                q = q->next;
        }       free(q);
        return (head);
}
int main(int argc, char **argv)
{
        int listenfd, connfd = 0,ret,wrt;
        cli_list head, ph;
        int b_reuse = 1;
        socklen_t len;
        struct timeval tv;
        struct sockaddr_in servaddr, cliaddr;
        char buf[MAX_LINE],siz[SIZ];
        fd_set readset;
        head = (cli_list) malloc(sizeof(cli_node));
        head->next = NULL;
        /*for (i = 3; i < sysconf(_SC_OPEN_MAX); i++)
                close(i);
        */listenfd = socket(AF_INET, SOCK_STREAM, 0);
        if(listenfd < 0)
        {
                fprintf(stderr,"socket() error!, listenfd = %d\n", listenfd);
                exit(1);
        }
        head->clifd = listenfd;
        setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof(int));

        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(SERV_PORT);
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_addr.s_addr=inet_addr(SERVADDR);
        if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) != 0)
        {
                perror("bind");
                exit(1);
        }
        listen(listenfd, BACK_LOG);
        while (1)
                {
                        FD_ZERO(&readset);
                        FD_SET(listenfd, &readset);
                        FD_SET(connfd,&readset);
                        FD_SET(0,&readset);
                        tv.tv_sec=0;
                        tv.tv_usec=0;
                        ph = head;
                while (ph->next)

        p->next = q->next;
        close(fd);
          {
                        FD_SET(ph->next->clifd, &readset);
                        ph = ph->next;
                }
                 ret=(select((ph->clifd) + 1, &readset, NULL, NULL,&tv));
                if (ret<0)
                        {
                                perror ("error");
                                break;
                        }
                else if (ret==0)
                        {   continue;}
                        if (FD_ISSET(listenfd,&readset))
                        {
                                len = sizeof(cliaddr);
                                connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &len);
                                head = add_cli(head, connfd);
                                continue;
                        }
                for (connfd = (listenfd + 1); connfd <= (ph->clifd); connfd++)
                {
                        if (FD_ISSET(connfd, &readset))
                        {
                                bzero(buf,MAX_LINE);
                                if (recv(connfd, buf,MAX_LINE, 0) <= 0)//接收客户端信息
                                {
                                        head = delete_cli(head, connfd);
                                        break;
                                }
                                //printf("from client msg:%s\n", buf);  

                                //siz[strlen(buf)]='\0';                                
                                if ((send(connfd,siz,strlen(buf)0))<=0)//把接收在缓冲区的信息发回客户端————————这个过程发生数据丢失  求解????????????????????
                                {
                                        head=delete_cli(head,connfd);
                                        continue;
                                }

                        }
                        if (FD_ISSET(0,&readset))
                        {
                                                    
                                bzero (buf,MAX_LINE);
                                scanf ("%s",buf);
                                if (send(connfd,buf,strlen(buf), 0)<0)//发送信息给客户端
                                {
                                        head=delete_cli(head,connfd);
                                        break;
                                }
                        //      printf("from server msg:%s\n",buf);
                        }

                }


                }
close(connfd);
free(head);
}