请教 ?????把接收在缓冲区的数据发回客户端 数据丢失??????
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);
}