Multithreaded network service
1. Multithreaded network service
The multi-threaded network mode is similar to the multi-process network mode, except that when a new client arrives, a thread is started (a thread will be created for each customer).
Model analysis
2. Code implementation
Processing integer operations is also used to simulate the concurrent processing of multithreads.
(1), utili.h
# include#include#include#include#include#include#include#include#define SERVER_PORT 9090#define SERVER_IP "127.0.0.1" # define LISTEN_QUEUE 5#define BUFFER_SIZE 255typedef enum {ADD,SUB,MUL,DIV,MOD, QUIT} OPER_TYPE;typedef struct OperStruct {int op1; int op2; OPER_TYPE oper;} OperStruct
(2), ser.c
# include ".. / utili.h" void* Thread_Handler (void* arg); void* Thread_Handler (void* arg) {int sockConn = * (int *) arg; OperStruct op; int result; while (1) {int res = recv (sockConn, & op, sizeof (op), 0); if (res =-1) {printf ("recv data fail.\ n"); continue } if (op.oper = = ADD) {result = op.op1 + op.op2;} else if (op.oper = = SUB) {result = op.op1-op.op2;} else if (op.oper = = MUL) {result = op.op1 * op.op2;} else if (op.oper = = DIV) {result = op.op1 / op.op2 } else if (op.oper = = QUIT) {break;} res = send (sockConn, & result, sizeof (result), 0); if (res = =-1) {printf ("send data fail.\ n"); continue;}} close (sockConn); pthread_exit (0) } int main (void) {int sockSer = socket (AF_INET, SOCK_STREAM, 0); if (sockSer = =-1) {perror ("socket"); return-1;} struct sockaddr_in addrSer, addrCli; addrSer.sin_family = AF_INET; addrSer.sin_port = htons (SERVER_PORT); addrSer.sin_addr.s_addr = inet_addr (SERVER_IP); socklen_t len = sizeof (struct sockaddr) Int res = bind (sockSer, (struct sockaddr*) & addrSer, len); if (res = =-1) {perror ("bind"); close (sockSer); return-1;} listen (sockSer, LISTEN_QUEUE); int sockConn; while (1) {printf ("Server Wait Client Connect.\ n") SockConn = accept (sockSer, (struct sockaddr*) & addrCli, & len); if (sockConn = =-1) {printf ("Server Accept Client Connect Fail.\ n"); continue;} else {printf ("Server Accept Client Connect Success.\ n"); printf ("Client IP: >% s\ n", inet_ntoa (addrCli.sin_addr)) Printf ("Client Port: >% d\ n", ntohs (addrCli.sin_port));} pthread_t tid; pthread_create (& tid, NULL, Thread_Handler, & sockConn);} close (sockSer); return 0;}
(3), cli.c
# include "utili.h" void InputData (OperStruct * pt); void InputData (OperStruct * pt) {printf ("please input op1 and op2:"); scanf ("d% d", & (pt- > op1), & (pt- > op2));} / / Cliint main (void) {int sockCli = socket (AF_INET, SOCK_STREAM, 0); if (sockCli =-1) {perror ("socket"); return-1 } struct sockaddr_in addrSer; addrSer.sin_family = AF_INET; addrSer.sin_port = htons (SERVER_PORT); addrSer.sin_addr.s_addr = inet_addr (SERVER_IP); socklen_t len = sizeof (struct sockaddr); int res = connect (sockCli, (struct sockaddr*) & addrSer, len); if (res = =-1) {perror ("connect"); close (sockCli) Return-1;} else {printf ("Client Connect Server Success.\ n");} char cmd [2]; OperStruct op; int result; while (1) {printf ("Please input operator:"); scanf ("% s", cmd); if (strcmp (cmd, "+") = = 0) {op.oper = ADD; InputData (& op) } else if (strcmp (cmd, "-") = = 0) {op.oper = SUB; InputData (& op);} else if (strcmp (cmd, "*") = = 0) {op.oper = MUL; InputData (& op);} else if (strcmp (cmd, "/") = = 0) {op.oper = DIV; InputData (& op) } else if (strcmp (cmd, "quit") = = 0) {op.oper = QUIT;} else {printf ("Cmd invalid.\ n");} res = send (sockCli, & op, sizeof (op), 0); if (res = =-1) {printf ("send data fail.\ n"); continue } if (op.oper = = QUIT) break; res = recv (sockCli, & result, sizeof (result), 0); if (res = =-1) {printf ("recv data fail.\ n"); continue;} printf ("result =% d\ n", result);} close (sockCli); return 0;}
Running result
Server side
Customer 1
Customer 2
3. Analysis and summary
Multithreaded network service also has dynamic application and release of threads, but it still has some overhead. If there are a large number of users online, it is likely to bring overhead of switching between threads.