Get the App
SLTechnology News&Howtos  ›  Network Security  › 

Multithreaded network service

Shulou Source: shulou.com Published: 2022-06-01 03:09:06 09月29日 Update

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.

Tags: Threads networks customers services network services overhead patterns analysis processing differences code dynamics clients integers servers models users results or processes Apple Docker Huawei Linux macOS MariaDB Microsoft MySQL NVidia OPPO Reno MariaDB MySQL Linux macOS OPPO Reno