Try   HackMD

Simple OOP TCP server

Author: WhoAmI
Date: 20230314
email: kccddb@gmail.com
Copyright: CC BY-NC-SA

沒有處理 signal, timeout 等問題, 只是 提供 OOP 思考

可以 CServer_init 後 自行用 自己設計的 function 取代 default_read; default_accept;

cserver.h typedef struct _CServer { int fd; unsigned short int port; int time_out; struct sockaddr client_addr; int (*on_read)(struct _CServer *pServer,char *buf,int len); int client_fd; int (*on_accept)(struct _CServer *pServer); int fdmax; }CServer; struct _CServer *CServer_init(unsigned short int port); void CServer_exit(struct _CServer *pServer);
cserver.c #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/time.h> #include <string.h> #include "cserver.h" static int bind_server(unsigned short int port) { int server_fd; int yes; struct sockaddr_in server_addr; yes=1; if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ return -1; } if (setsockopt(server_fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) { perror("setsockopt"); close(server_fd); return -1; } memset(&server_addr,0,sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(port); if (bind(server_fd,(struct sockaddr *)&server_addr,sizeof(server_addr))==-1) { perror("bind"); close(server_fd); return -1; } if (listen(server_fd,50) == -1) { perror("listen"); close(server_fd); } printf("[1] Create TCP Server on %d\n",port); return server_fd; } static int default_read(struct _CServer *pServer,char *buf,int len){ //default read op int n; printf("Enter Default Read...\n"); n=read( pServer->client_fd,buf,len); return n; } static int default_accept(struct _CServer *pServer){ //default read op int len; len=sizeof(struct sockaddr); if ((pServer->client_fd=accept(pServer->fd ,(struct sockaddr *)&(pServer->client_addr) ,(socklen_t*)&len ) <0)){ perror("accept"); } printf("New TCP connection...\n"); return pServer->client_fd; } //Generate CServer Object struct _CServer *CServer_init(unsigned short int port){ struct _CServer *pthis; pthis=(struct _CServer *) malloc(sizeof(struct _CServer)); if (pthis==NULL){ return NULL; } memset(pthis,0,sizeof(CServer)) ; pthis->fd=bind_server(port); pthis->port=port; pthis->on_read=default_read; pthis->on_accept=default_accept; printf("Create TCP Server on %d fd=%d\n",port, pthis->fd); return pthis; } //Destory CServer Object void CServer_exit(struct _CServer *pServer){ if(pServer){ close(pServer->client_fd); close(pServer->fd); free( (void *)pServer); } } #ifdef TEST main() { CServer *p; char buf[80]; int n; p=CServer_init(8000); if(p){ p->on_accept(p); for(;;){ n=p->on_read(p,buf,80); if(n>0 && n<80)buf[n]=0; //set string printf("len=%d, %s\n",n,buf); if(buf[0]=='q'){ printf("Quit! Clean server!"); break; } } CServer_exit(p); } } #endif