|
源代码:printf()语句为测试所用
# include <sys/types.h>
# include <sys/socket.h>
# include <stdio.h>
# include <stdlib.h>
# include <netinet/in.h>
# include <string.h>
# include <sys/select.h>
# include <sys/time.h>
# include <sys/types.h>
# include <unistd.h>
# include <fcntl.h>
# include <errno.h>
# include <netinet/tcp.h>
# include <arpa/inet.h>
# define SA struct sockaddr
int CheckSockets(int sockfd1);
int CliConnection(int sockfd2);
int ReadSocket(int sockfd3);
int CloseConnections();
fd_set rfds, afds;
int maxfd,client[FD_SETSIZE];
int main()
{
int listenfd,sockfd,i,retsec,maxi = -1,n,on = 1;
struct sockaddr_in seraddr;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("creat listenfd failed!\n");
return -1;
}
memset((char *)&seraddr, 0, sizeof(seraddr));
seraddr.sin_family = AF_INET;
seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
seraddr.sin_port = htons(8001);
if(setsockopt(listenfd, SOL_SOCKET,SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) {
printf("set sockopt failed!\n");
return -1;
}
if (bind(listenfd,(struct sockaddr*)&seraddr,sizeof(seraddr)) < 0) {
printf("bind failed!\n");
return -1;
}
if (listen(listenfd, 5) < 0) {
printf("listening failed!\n");
return -1;
}
for (i=0;i<FD_SETSIZE;i++)
client = -1;
maxfd = listenfd ;
FD_ZERO(&afds);
FD_SET(listenfd, &afds);printf("listenfd:%d\n",listenfd);
printf("start listen...\n");
for(;;) {
if (retsec = CheckSockets(maxfd) > 0) {printf("check 1st\n");
for(i=0;i<=maxfd;i++) {printf("i::%d\n",i);
if (!FD_ISSET(i, &rfds)) continue ;printf("isset 1st...i::%d\n",i);
if (i == listenfd){
if ((maxi = CliConnection(listenfd)) > -1)
printf("client conn succ!\n");
else
printf("creat connfd failed!\n");
}
}printf("1st for after\n");
}else if (retsec == 0){printf("check time out\n");
continue;}
else {printf("check failed!\n");
break;}
printf("before maxi\n");
printf("maxi::%d\n",maxi);
if (maxi > -1)
for (i=0;i<=maxi;i++) {printf("for 2nd...client::%d\n",client);
if(sockfd = client < 0)
continue;
if (FD_ISSET(sockfd,&afds)){printf("connfd is read\n");
if (n = ReadSocket(sockfd) > 0)
printf("read sockfd succ!\n");
else if (n = 0)
printf("read 0 byte!\n");
else{
close(sockfd);
client = -1;
printf("read sockfd < 0\n");
}
}
}
}printf("close before\n");
CloseConnections();
}
/*检查是否有描述字准备好*/
int CheckSockets(int sockfd1)
{
int retval;
struct timeval xt;
xt.tv_sec = 2 ;
xt.tv_usec = 0;
memcpy((char *)&rfds, (char *)&afds, sizeof(rfds));
retval = select(sockfd1 + 1, &rfds, NULL,NULL, &xt);
if (retval < 0) {
if (errno == EINTR) return 1 ;
else {
return -1 ;
}
}else if (retval == 0)
return 0;
else
return 1;
}
/*创建连接套接字,成功则将其值赋给client*/
int CliConnection(int sockfd2)
{
int i,connfd ;
int on = 1;
struct timeval xt;
xt.tv_sec = 2 ;
xt.tv_usec = 0;
if ((connfd = accept(sockfd2, NULL,NULL)) < 0) {
return -1;
}
if (setsockopt(connfd, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on)) < 0) {
return -1;
}
/*if (setsockopt(connfd,SOL_SOCKET,SO_RCVTIMEO,&xt,sizeof(xt)) < 0)
return -1;*/printf("connfd::%d\n",connfd);
if (fcntl(connfd, F_SETFL, O_NONBLOCK) < 0) {
return -1 ;
}
for (i=0;i<FD_SETSIZE;i++)
if (client < 0) {
client = connfd;
break;
}
if (maxfd < connfd)
maxfd = connfd;
FD_SET(connfd, &afds);
return i;
}
/*读可以读的描述字*/
int ReadSocket(int sockfd3)
{
int fpout1,n,fpout;
FILE * fpout2;
char line[512] = {NULL};
char file[100];
sprintf(file,"logg");
if((fpout1=open(file,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1) {
printf("creat file failed!\n");
exit(1);
}
//fpout = fopen(file,"w");
memset(line,0,sizeof(line));
n = recvfrom(sockfd3,line,512,0,NULL,NULL);
if (n < 0){
if (errno == EWOULDBLOCK){
printf("socket timeout!\n");
return 1;
}
}else
return -1;
if (n = 0)
return 0;
line[n] = 0;
printf("line:%s\n",line);
write(fpout1,line,n);
return 1;
}
int CloseConnections()
{
int i,fd;
for (i=0;i<FD_SETSIZE;i++) {
if (fd = client < 0)
continue;
if (fd > 0) {
close(fd);
FD_CLR(fd, &afds);
client = -1;
}
}
} |
|