完整代码链接
https://github.com/BrilliantFish/Toggle
单进程的简易网络服务器
C语言代码示例
#include "wrapper.h"
void toggle(int connect_sock){
int n;
int i;
char buf[MAXLINE];
char message[] = "receive success";
while((n = recv(connect_sock, buf, MAXLINE, 0)) > 0){
printf("toggle server received %d bytes : %s", n, buf);
send(connect_sock, message, MAXLINE, 0);
bzero((char*)&buf, sizeof(buf));
}
}
int open_listen_sock(int port){
int server_sock;
int optval = 1;
struct sockaddr_in server_addr;
if((server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
return -1;
}
if(setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, (const void*)&optval, sizeof(int)) < 0){
return -1;
}
bzero((char*)&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons((unsigned int)port);
if(bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0){
return -1;
}
if(listen(server_sock, LISTENQ) < 0){
return -1;
}
return server_sock;
}
int main(int argc, char **argv){
int server_sock;
int connect_sock;
int client_len;
int port;
struct sockaddr_in client_addr;
struct hostent *client_host_ptr;
if(argc != 2){
fprintf(stderr, "usage: %s <port>\n", argv[0]);
return 1;
}
port = atoi(argv[1]);
server_sock = open_listen_sock(port);
while(1){
client_len = sizeof(client_addr);
connect_sock = accept(server_sock, (struct sockaddr*)&client_addr, &client_len);
client_host_ptr = gethostbyaddr((const char*)&client_addr.sin_addr.s_addr, sizeof(client_addr.sin_addr.s_addr), AF_INET);
printf("server connected to %s (%s)\n", client_host_ptr->h_name, inet_ntoa(client_addr.sin_addr));
toggle(connect_sock);
close(connect_sock);
}
return 0;
}
多进程的简易网络服务器
C语言代码示例
#include "wrapper.h"
void toggle(int connect_sock){
int n;
int i;
char buf[MAXLINE];
char message[] = "receive success";
while((n = recv(connect_sock, buf, MAXLINE, 0)) > 0){
printf("toggle server received %d bytes : %s", n, buf);
send(connect_sock, message, MAXLINE, 0);
bzero((char*)&buf, sizeof(buf));
}
}
int open_listen_sock(int port){
int server_sock;
int optval = 1;
struct sockaddr_in server_addr;
if((server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
return -1;
}
if(setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, (const void*)&optval, sizeof(int)) < 0){
return -1;
}
bzero((char*)&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons((unsigned int)port);
if(bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0){
return -1;
}
if(listen(server_sock, LISTENQ) < 0){
return -1;
}
return server_sock;
}
void sigchld_handler(int sig){
while(waitpid(-1, 0, WNOHANG) > 0)
;
return ;
}
int main(int argc, char **argv){
int server_sock;
int connect_sock;
socklen_t client_len = sizeof(struct sockaddr_in);
int port;
struct sockaddr_in client_addr;
if(argc != 2){
fprintf(stderr, "usage: %s <port>\n", argv[0]);
}
port = atoi(argv[1]);
signal(SIGCHLD, sigchld_handler);
server_sock = open_listen_sock(port);
while(1){
connect_sock = accept(server_sock, (struct sockaddr*)&client_addr, &client_len);
if(fork() == 0){
close(server_sock);
toggle(connect_sock);
close(connect_sock);
exit(0);
}
close(connect_sock);
}
return 0;
}
多线程的简易网络服务器
C语言代码示例
#include "wrapper.h"
void toggle(int connect_sock){
int n;
int i;
char buf[MAXLINE];
char message[] = "receive success";
while((n = recv(connect_sock, buf, MAXLINE, 0)) > 0){
printf("toggle server received %d bytes : %s", n, buf);
send(connect_sock, message, MAXLINE, 0);
bzero((char*)&buf, sizeof(buf));
}
}
int open_listen_sock(int port){
int server_sock;
int optval = 1;
struct sockaddr_in server_addr;
if((server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
return -1;
}
if(setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, (const void*)&optval, sizeof(int)) < 0){
return -1;
}
bzero((char*)&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons((unsigned int)port);
if(bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0){
return -1;
}
if(listen(server_sock, LISTENQ) < 0){
return -1;
}
return server_sock;
}
void *serve_client(void *vargp){
int connect_sock = *((int *)vargp);
pthread_detach(pthread_self());
free(vargp);
toggle(connect_sock);
close(connect_sock);
return NULL;
}
int main(int argc, char **argv){
int server_sock;
int *connect_sock_ptr;
socklen_t client_len = sizeof(struct sockaddr_in);
int port;
struct sockaddr_in client_addr;
pthread_t tid;
if(argc != 2){
fprintf(stderr, "usage: %s <port>\n", argv[0]);
}
port = atoi(argv[1]);
server_sock = open_listen_sock(port);
while(1){
connect_sock_ptr = malloc(sizeof(int));
*connect_sock_ptr = accept(server_sock, (struct sockaddr*)&client_addr, &client_len);
pthread_create(&tid, NULL, serve_client, connect_sock_ptr);
}
return 0;
}