Http服务器实现文件上传与下载(三)(1)(2)
源文件(src/socket.h)
1 #include "socket.h" 2 namespace TCP{ 3 Socket::Socket() { 4 } 5 Socket::~Socket() { 6 } 7 int Socket::server_socket() { 8 listenfd= socket(AF_INET,SOCK_STREAM,0); 9 if(listenfd !=-1){ 10 std::cout<<"server_socket() ...succeed"< 11 }else{ 12 std::cout<<"server_socket() ...failed"< 13 } 14 return listenfd; 15 } 16 17 int Socket::server_listen() { 18 int ret = listen(listenfd,100); 19 if(ret ==0){ 20 std::cout<<"server_listen() ...succeed"< 21 }else{ 22 std::cout<<"server_listen() ...failed"< 23 } 24 return ret; 25 } 26 void Socket::server_close(int confd) { 27 close(confd); 28 } 29 int Socket::server_accept() { 30 clientlen = sizeof(struct sockaddr_in); 31 int fd = accept(listenfd,(struct sockaddr *)&clientaddr,&clientlen); 32 if(fd !=-1){ 33 std::cout<<"server_accept() ...succeed"< 34 }else{ 35 std::cout<<"server_accept() ...failed"< 36 } 37 return fd; 38 } 39 int Socket::server_bind() { 40 int ret =bind(listenfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr)); 41 if(ret ==0){ 42 std::cout<<"server_bind() ...succeed"< 43 }else{ 44 std::cout<<"server_bind() ...failed"< 45 } 46 return ret; 47 } 48 void Socket::server_init() { 49 bzero(&serveraddr,sizeof(serveraddr)); 50 serveraddr.sin_family=AF_INET; 51 serveraddr.sin_addr.s_addr=htonl(INADDR_ANY); 52 serveraddr.sin_port=htons(PORT); 53 54 } 55 ssize_t Socket::server_read(int fd,char*recvBuf,ssize_t maxlen) { 56 long long havedreadCount=0; 57 int readCount=0; 58 while(1){ 59 readCount = __readline(fd,recvBuf+havedreadCount,maxlen); 60 havedreadCount+=readCount; 61 //std::cout<<"readCount:"< 62 if(readCount==0)//当一行是\r\n时,空行,表示这一次读完。 63 break; 64 } 65 return 0; 66 67 } 68 ssize_t Socket::server_write(int fd,char*sendBuf,ssize_t maxlen){ 69 70 return __writen(fd,sendBuf,maxlen); 71 } 72 int Socket::__writen(int fd,char*sendBuf,ssize_t maxlen){ 73 size_t nleft; 74 ssize_t nwritten; 75 const char *ptr; 76 ptr=sendBuf; 77 nleft=maxlen; 78 //int count=0; 79 80 while(nleft>0){ 81 if((nwritten=write(fd,ptr,nleft))<=0){ 82 if(nwritten<0&& errno==EINTR) 83 nwritten=0; 84 else{ 85 return -1; 86 } 87 } 88 nleft-=nwritten; 89 ptr+=nwritten; 90 } 91 return maxlen; 92 } 93 int Socket::__readline(int fd,char*recvBuf,ssize_t maxlen) { 94 ssize_t n,rc; 95 char c,*ptr; 96 ptr=recvBuf; 97 for(n=1;n 98 again: 99 if((rc=read(fd,&c,1))==1){ 100 *ptr++=c; 101 //std::cout< 102 if(c=='\n') 103 break; 104 }else if(rc ==0){ 105 *ptr=0; 106 return n-1; 107 }else{ 108 if(errno ==EINTR) 109 goto again; 110 return -1; 111 } 112 } 113 *ptr=0; 114 if(n==2&&*(ptr-2)=='\r'&&*(ptr-1)=='\n') 115 n=0; 116 return n; 117 } 118 }
评论暂时关闭