📄 server.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 + -