main()
{
int sock;
FILE *fp;
struct fd_set fds;
struct tim timeout={3,0}; /lect等待3秒,3秒轮询,要非阻塞就置0
char buffer[256]={0}; //256字节的接收缓冲区
while(1)
{
FD_ZERO(&fds); //每次循环都要清空集合,否则不能检测描述符变化
FD_SET(sock,&fds); //添加描述符
FD_SET(fp,&fds); //同上
maxfdp=sock>fp?sock+1:fp+1; //描述符最大值加1
switch(select(maxfdp,&fds,&fds,NULL,&timeout)) /lect使用
{
case -1: exit(-1);break; /lect错误,退出程序
case 0:break; //再次轮询
default:
if(FD_ISSET(sock,&fds)) //测试sock是否可读,即是否网络上有数据
{
recvfrom(sock,buffer,256,.....);//接受网络数据
if(FD_ISSET(fp,&fds)) //测试文件是否可写
fwrite(fp,buffer...);//写入文件
buffer清空;
}// end if break;
}// end switch
}//end while
}//end main
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>
#define PORT 1356
#define MAX_QUE_CONN_NM 5
#define MAX_SOCK_FD FD_SETSIZE
#define BUFFER_SIZE 1024
int main()
{
struct sockaddr_in server_sockaddr, client_sockaddr;
int sin_size, count;
fd_set inset, tmp_inset;
int sockfd, client_fd, fd;
char buf[BUFFER_SIZE];
if( (sockfd=socket(AF_INET, SOCK_STREAM, 0)) == -1 )
{
perror("socket error");
exit(1);
}
//bzero(&(server_sockaddr), sizeof(server_sockaddr));
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(PORT);
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bzero( &(server_sockaddr.sin_zero), 8 );
int i = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr)) == -1)
{
perror("bind error");
exit(1);
}
if (listen(sockfd, MAX_QUE_CONN_NM) == -1)
{
perror("listen error");
exit(1);
}
printf("MAX_SOCK_FD=%d\n", MAX_SOCK_FD);
printf("listening...\n");
FD_ZERO(&inset);
FD_SET(sockfd, &inset);
while(1)
{
tmp_inset = inset;
sin_size = sizeof(struct sockaddr_in);
memset(buf, 0, sizeof(buf));
if (!(select(MAX_SOCK_FD, &tmp_inset, NULL, NULL, NULL)>0))
{
perror("select error");
}
for (fd=0; fd<MAX_SOCK_FD; fd++)
{
if (FD_ISSET(fd, &tmp_inset)>0)
{
if (fd == sockfd)
{
if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1)
{
perror("accept error");
exit(1);
}
FD_SET(client_fd, &inset);
printf("new connect from %d(socket)\n", client_fd);
}
else
{
if ((count=recv(fd, buf, BUFFER_SIZE, 0)) >0)
{
printf("received a data from %d: %s\n", fd, buf);
}
else
{
close(fd);
FD_CLR(fd, &inset);
printf("Client %d(socket) has left\n", fd);
}
}
}
}
}
close(sockfd);
exit(0);
}