Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

Multithreaded network service

2025-01-20 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Network Security >

Share

Shulou(Shulou.com)06/01 Report--

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.

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Network Security

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report