关于进程和线程的知识,请看我相关的简单博文,不足之处,请之处,相互学习
tcp并发服务器之线程
1 #include <stdio.h>
2 #include <sys/time.h>
3 #include <sys/types.h>
4 #include <unistd.h>
5 #include <fcntl.h>
6
7 #include <sys/types.h> /* See NOTES */
8 #include <sys/socket.h>
9 #include <netinet/in.h>
10 #include <arpa/inet.h>
11 #include <signal.h>
12
13 #include <string.h>
14
15 #include <pthread.h>
16
17 #define PORT 6543
18
19 int init_socket(int port)
20 {
21 /*创建套接字,用于连接*/
22 int s = socket(AF_INET, SOCK_STREAM, 0);
23 if(0 > s){
22 int s = socket(AF_INET, SOCK_STREAM, 0);
23 if(0 > s){
24 perror("socket");
25 return -1;
26 }
27
28 /*端口重用*/
29 int reuseaddr = 1;
30 if(0 > setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &reuseaddr,
sizeof(re useaddr))){
31 perror("setsockopt");
32 return -1;
33 }
34
35 /*绑定server IP及端口号*/
36 struct sockaddr_in addr;
37 memset(&addr, 0, sizeof(struct sockaddr_in));
38 addr.sin_family = AF_INET;
39 addr.sin_port = htons(port);
40 addr.sin_addr.s_addr = htonl(INADDR_ANY);
41
42 socklen_t addrlen = sizeof(struct sockaddr_in);
43 if(0 > bind(s, (struct sockaddr *)&addr, addrlen)){
44 perror("bind");
45 return -1;
46 }
47
48 /*设置监听数*/
49 listen(s, 10);
50
51 return s;
52 }
53
54 void* rountine(void *arg)
55 {
56 int s = (int) arg;
57 while(1){
58 #define MAX 64
59 char buf[MAX];
60 bzero(buf, MAX);
61 int ret = read(s, buf, MAX);
62 if(0 >= ret){
63 printf("---leave-%d-\n", s);
64 close(s);
65 return NULL;
66 }
67
68 printf("RECV:%s[%d]\n", buf, ret);
69 }
70
71 return (void*)0;
72 }
73
74 int main()
75 {
76 int s = init_socket(PORT);
77 if(0 > s){
78 return -1;
79 }
80
81 struct sockaddr_in addr;
82 memset(&addr, 0, sizeof(struct sockaddr_in));
83 socklen_t addrlen = sizeof(struct sockaddr_in);
84
85 while(1){
86 int clients = accept(s, (struct sockaddr *)&addr,
&addrlen);
87 if(0 > clients){
88 return -1;
89 }
90
91 printf("New connect: SOCKET[%d], %s:%d\n",\
92 clients, inet_ntoa(addr.sin_addr), ntohs
(addr.sin_p ort));
93
94 pthread_t tid;
95 pthread_create(&tid, NULL, rountine, (void*)
clients);
96 }
97
98 exit(0);
99 return 0;
100 }
101
tcp并发服务器之线程
1 #include <stdio.h>
2 #include <sys/time.h>
3 #include <sys/types.h>
4 #include <unistd.h>
5 #include <fcntl.h>
6
7 #include <sys/types.h> /* See NOTES */
8 #include <sys/socket.h>
9 #include <netinet/in.h>
10 #include <arpa/inet.h>
11 #include <signal.h>
12
13 #include <string.h>
14
15 #include <pthread.h>
16
17 #define PORT 6543
18
19 int init_socket(int port)
20 {
21 /*创建套接字,用于连接*/
22 int s = socket(AF_INET, SOCK_STREAM, 0);
23 if(0 > s){
22 int s = socket(AF_INET, SOCK_STREAM, 0);
23 if(0 > s){
24 perror("socket");
25 return -1;
26 }
27
28 /*端口重用*/
29 int reuseaddr = 1;
30 if(0 > setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &reuseaddr,
sizeof(re useaddr))){
31 perror("setsockopt");
32 return -1;
33 }
34
35 /*绑定server IP及端口号*/
36 struct sockaddr_in addr;
37 memset(&addr, 0, sizeof(struct sockaddr_in));
38 addr.sin_family = AF_INET;
39 addr.sin_port = htons(port);
40 addr.sin_addr.s_addr = htonl(INADDR_ANY);
41
42 socklen_t addrlen = sizeof(struct sockaddr_in);
43 if(0 > bind(s, (struct sockaddr *)&addr, addrlen)){
44 perror("bind");
45 return -1;
46 }
47
48 /*设置监听数*/
49 listen(s, 10);
50
51 return s;
52 }
53
54 void* rountine(void *arg)
55 {
56 int s = (int) arg;
57 while(1){
58 #define MAX 64
59 char buf[MAX];
60 bzero(buf, MAX);
61 int ret = read(s, buf, MAX);
62 if(0 >= ret){
63 printf("---leave-%d-\n", s);
64 close(s);
65 return NULL;
66 }
67
68 printf("RECV:%s[%d]\n", buf, ret);
69 }
70
71 return (void*)0;
72 }
73
74 int main()
75 {
76 int s = init_socket(PORT);
77 if(0 > s){
78 return -1;
79 }
80
81 struct sockaddr_in addr;
82 memset(&addr, 0, sizeof(struct sockaddr_in));
83 socklen_t addrlen = sizeof(struct sockaddr_in);
84
85 while(1){
86 int clients = accept(s, (struct sockaddr *)&addr,
&addrlen);
87 if(0 > clients){
88 return -1;
89 }
90
91 printf("New connect: SOCKET[%d], %s:%d\n",\
92 clients, inet_ntoa(addr.sin_addr), ntohs
(addr.sin_p ort));
93
94 pthread_t tid;
95 pthread_create(&tid, NULL, rountine, (void*)
clients);
96 }
97
98 exit(0);
99 return 0;
100 }
101