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
Authors: CrazyDog, CrazyMonkeyemail: kccddb@gmail.comDate: 20230222
Mar 14, 2025Author: \mathcal{CrazyDog}, Ph.D. in Electrical Engineering, NCTUemail: kccddb@gmail.comDate: 20230910
Nov 4, 2024Author: WhoAmI Date: 20230523 email:kccddb@gmail.com Copyright: CC BY-NC-SA 《荀子‧勸學》不積跬步,無以至千里;不積小流,無以成江海。 I. Mutex variables MUST be declared with type pthread_mutex_t, and must be initialized before they can be used. II. 了解 pthread_mutex_lock / pthread_mutex_unlock 與可能問題和代價 III. 程式執行效率與startvation 等問題
Jul 11, 2024Author: WhoAmIemail: kccddb@gmail.com
Dec 6, 2023or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up