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

📄 server.cpp

📁 在linux2.6内核下编的基于socket的通信程序
💻 CPP
字号:
#include <iostream>#include <arpa/inet.h>#include <stdlib.h>#include <string.h>#include <string>#include <errno.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/wait.h>#include <unistd.h>#include <pthread.h>#include <fstream.h>using namespace std;const int MAXSIZE = 4096;  //缓冲区大小const int MAXLINE = 1000; //在一条消息输出的最大字符数 const int LISTENQ = 20; //最大监听队列const int PORT = 5000; //服务器端口号const int MAXFD = 20; //最大客户连接数const char *SERVER_IP = "127.0.0.1"; //服务器端ipchar *desfile = "../newfile.c";   //目的文件const char *dest_file;void *get_client(void *);int recvfile(int, char *);void read_file(const char *, int, int);int i,maxi = -1;int client[MAXFD];int autosockfd = 0;int main() {	int connfd,listenfd,sockfd;	socklen_t length;	struct sockaddr_in server;	struct sockaddr tcpaddr;	pthread_t tid;	listenfd = socket(AF_INET, SOCK_STREAM, 0);	if(listenfd < 0) 	{		cout<<"建立套接口错误"<<endl;		exit(1);		}	memset(&server, 0, sizeof(server));	server.sin_family = AF_INET;	server.sin_port = htons(PORT);//	server.sin_addr.s_addr = htonl(INADDR_ANY);	server.sin_addr.s_addr = inet_addr(SERVER_IP);	if(bind(listenfd, (struct sockaddr*)&server,sizeof(server)) < 0) 	{		cout<<"绑定端口失败"<<endl;		exit(1);	}	length = sizeof(server);	if(getsockname(listenfd, (struct sockaddr*)&server, &length) < 0) 	{		cout<<"取服务器端口号失败"<<endl;		exit(1);	}	for(i=0; i<MAXFD; i++) 	{		client[i] = -1;	}	listen(listenfd, LISTENQ);	cout<<"服务器监听端口"<<ntohs(server.sin_port)<<endl;	while(true) 	{		autosockfd = connfd = accept(listenfd, &tcpaddr, &length);	/*	for(i = 0; i < MAXFD; i++) {			if(client[i] < 0) {				client[i] = connfd;				break;			}*/			if(i == MAXFD - 1) 			{				cout<<"服务器达到最大用户数"<<endl;				exit(1);						}			if(i > maxi) 			{				maxi = i;			}			pthread_create(&tid, NULL, &get_client, (void *)connfd);	//	}	}	return 0;}void *get_client(void *sockfd) {//	char buf[MAXLINE];//	char sizebuf[100];	int rev;//	int revinfo_size;	if((int)sockfd < 0) 	{		cout<<"新的客户端连接失败。。。。。"<<endl;	} 	else 	{		cout<<"有新的客户端连接。。。。。。"<<endl;/*		do 		{			memset(buf, 0, sizeof(buf));			revinfo_size = recv(autosockfd, sizebuf, 1024, 0);			if(revinfo_size < 0)			{				cout<<"读取客户端信息大小失败"<<endl;			}			cout<<sizebuf<<endl;			rev = recv(autosockfd, buf, 1024, 0);*/			rev = recvfile(autosockfd,desfile);		//	rev=recv((int)sockfd, buf, 1024, 0);				if(rev < 0) 			{				cout<<"读取客户机信息失败"<<endl;					}			if(rev == 0) 			{				cout<<"客户机已终止连接"<<endl;			} 	/*		else 			{			        cout<<recvbuf<<endl;				for(i = 0; i <= maxi; i++) 				{					send(client[i], buf, strlen(buf)+1, 0 );					send(autosockfd, buf, strlen(buf)+1,0);									}			} 		} while (rev != 0); */		 		}	cout<<"客户机发送过来的信息如下:"<<endl;	read_file(desfile, ios::in, 0);	close((int)sockfd);	return NULL;}/* 从客户端接收文件 */ int recvfile(int cli, char *desfile) { 	int buflen = 0; //接收缓冲区数组的长度	int len = 0;  //接收缓冲区数组实际长度	int num = 0; //从客户端接收数据的大小	int flag;  //所有数据接收完成的标志	FILE *desfp; 	//目的文件指针				char buf[MAXSIZE];   //写目的文件的数据	char recvbuf[MAXSIZE];  //从客户端接收数据的存储数组	char *p;    //指向recvbuf数组的指针	int i;    //int的长度	if((desfp = fopen(desfile, "wb")) == NULL) 	{ 		perror("open exefile error"); 		exit(1); 	} 	buf[0] = '\0'; 	recvbuf[0] = '\0'; 	i = sizeof(buflen); 	if((num=recv(cli, recvbuf, sizeof(recvbuf), 0)) == -1) 	{ 		perror("recv data error"); 		exit(1); 	} 	printf("\nnum:%d\t", num); 	p = recvbuf; 	memcpy(&buflen, p, i); 	printf("buflen:%d\t", buflen); 	if(buflen != 0) 	{ 		flag = 1; 		p = p + i; 		num = num - i; 	} 	while(flag) 	{ 		while(buflen <= num) 		{ 			len = buflen; 			memcpy(buf, p, len); 			if(fwrite(buf, 1, len, desfp) != len)  //写文件			{ 				perror("fwrite error"); 				exit(1); 			} 			num = num - len;  //改变指针偏移量 			buflen = buflen - len; 			if(num > 0) 			{ 				p = p + len; 				memcpy(&buflen, p, i); 				printf("buflen:%d\t", buflen); 				p = p + i; 				num = num - i; 				if(buflen == 0) 				{ 					flag = 0; 					break; 				} 			} 			else 			{ 				break; 			} 		} 		if(flag == 0) 		{ 			break; 		} 		if(buflen > num) 		{ 			if(num > 0) 			{ 				len = num; 				memcpy(buf, p, len); 				if(fwrite(buf, 1, len,desfp) != len) 				{ 					perror("fwrite error"); 					exit(1); 				} 				buflen = buflen - len; 			}	 		} 		if((num = recv(cli, recvbuf, sizeof(recvbuf), 0)) == -1) 		{ 			perror("recv data error"); 			exit(1); 		}		cout<<recvbuf<<endl; 		printf("\nnum:%d\t", num); 		p = recvbuf;		if(buflen == 0) 		{ 			memcpy(&buflen, p, i); 			printf("buflen:%d\t", buflen); 			p = p + i; 			num = num - i; 			if(buflen == 0) 			{ 				flag=0; 			} 		} 	} 	buf[0] = '\0'; 	strcpy(buf, "copy done!"); 	if(send(cli, buf, strlen(buf), 0)==-1) 	{ 		perror("send data error"); 		exit(1); 	} 	printf("\nbuf:%s\n", buf);	printf("\nrecvbuf:%s\n", recvbuf); 	fclose(desfp); //	cout<<recvbuf<<endl;	cout<<endl;	return 1; }void read_file(const char *desfile, int in,int access){	fstream src;	src.open(desfile);	char c;	while(!src.eof())	{		c = src.get();		cout<<c;	}	src.close();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -