📄 server11.c
字号:
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<resolv.h>
#include<errno.h>
#include<time.h>
#include<sys/ioctl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <fcntl.h>
#define SERVER_PORT 4000 // define the defualt connect port id
#define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server
#define BUFFER_SIZE 8192
#define C_MAXNET 100
int reportbufdata(unsigned char *pp, unsigned int len)
{
int i;
printf("DEBUG_DATA=\n");
for (i=0; i<len; i++)
{
printf("%02x ", pp[i]);
if (i%16 == 15) printf("\n");
};
printf("\n");
return 0;
};
int readdata(int sockfd, unsigned char * tData,int headlen)
{
int rdlen = -1;
int tTmpLen = 0;
char* pTmpData;
pTmpData = (char *)(tData);
if ((rdlen = recv(sockfd, tData, headlen, 0)) == -1)
{
//读取出现异常
fprintf(stderr, "Receive error:%s\n",strerror(errno));
return -1;
};
memcpy(&tTmpLen,tData,headlen);
int leftLen=tTmpLen-headlen;
pTmpData =pTmpData+headlen;
while (leftLen > 0)
{
if ((rdlen = recv(sockfd, pTmpData, leftLen, 0)) == -1)
{
//如果读取出现异常,关闭该连接,继续监听其他连接
fprintf(stderr, "Receive error:%s\n",strerror(errno));
return -3;
};
leftLen = leftLen - rdlen;
pTmpData =pTmpData+rdlen;
}
return 0;
};
int main(int argc, char **argv)
{
int server_sockfd;
struct sockaddr_in servaddr,cli_sockaddr;
int i,iret,rcd;
int maxfd;
int watch_fd_list[C_MAXNET];
fd_set watchset, catch_fd_set;
for (i=0;i<C_MAXNET;i++)
{
watch_fd_list[i]=-1;
};
if ((server_sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("create socket error!\n");
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVER_PORT);
//servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
if (bind(server_sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
{
printf("bind to port %d failure!\n",SERVER_PORT);
close(server_sockfd);
server_sockfd = 0;
exit(1);
}
if (listen(server_sockfd,C_MAXNET-1) < 0)
{
printf("call listen failure!\n");
close(server_sockfd);
server_sockfd = 0;
exit(1);
}
watch_fd_list[0]=server_sockfd;
FD_ZERO( &watchset );
FD_SET(server_sockfd, &watchset);
maxfd = watch_fd_list[0];
FILE *fp;
fp=fopen("caiji2.txt", "wb+");
if(fp==NULL)
{
printf("cannot open a file");
//close(socket_s1);
exit(1);
}
while (1)
{
catch_fd_set=watchset;
rcd = select( maxfd+1, &catch_fd_set, NULL, NULL, (struct timeval *)0 );
if ( rcd <= 0 )
{
//返回-1表示出现错误,返回0表示没有端口需要处理
usleep(100);
//printf("没有端口需要处理");
continue;
};
//调用FD_ISSET来检查是否有客户端的连接请求到达监听端口server_sockfd,
if (FD_ISSET( server_sockfd, &catch_fd_set ))
{
//如果返回值大于0,Server生成一个新的通信Socket(new_cli_fd)与客户端连接
//printf("Server生成一个新的通信Socket(new_cli_fd)");
int new_len=sizeof(cli_sockaddr);
int new_cli_fd;
new_cli_fd = accept(server_sockfd, (struct sockaddr *)(&cli_sockaddr), (socklen_t *)&new_len);
//printf("Connect ip=[%s]\n",inet_ntoa(cli_sockaddr.sin_addr));
//将新生成的通信Socket放入Socket监视集合中(FD_SET)。
for (i=1;i<C_MAXNET;i++)
{
if(watch_fd_list[i] != -1)
{
continue;
}
else
{
watch_fd_list[i] = new_cli_fd;
break;
}
}
FD_SET(new_cli_fd , &watchset);
if ( maxfd < new_cli_fd )
{
maxfd = new_cli_fd;
}
rcd --;
if (rcd == 0)
{
continue;
};
}
for ( i = 1; i<C_MAXNET; i++ )
{
int nread;
if (rcd == 0)
{
break;
};
//取出有数据的客户端ID号
if (watch_fd_list[i] == -1)
{
continue;
}
if (!FD_ISSET(watch_fd_list[i], &catch_fd_set))
{
continue;
}
rcd--;
//如果可读字节为0,表示是断开,将该socket从监视列表里清除
ioctl(watch_fd_list[i],FIONREAD,&nread);
if (nread==0)
{
printf("Server: Connection Closed socket %d\n", watch_fd_list[i]);
FD_CLR(watch_fd_list[i], &watchset);
close(watch_fd_list[i]);
watch_fd_list[i] = -1;
continue;
}
//读取一个数据
unsigned char buf[BUFFER_SIZE];
memset(buf,0,sizeof(buf));
iret = readdata(watch_fd_list[i], buf, 2);
if (iret != 0)
{
FD_CLR(watch_fd_list[i], &watchset);
close(watch_fd_list[i]);
watch_fd_list[i] = -1;
continue;
};
unsigned int iDataLen = 0;
memcpy(&iDataLen,buf,2);
//reportbufdata(buf, iDataLen);
fwrite(buf,sizeof(char),iDataLen,fp);
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -