⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server11.c

📁 本文是基于linux的tcp协议的网络编程
💻 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 + -