多线程并发服务器与客户端 ---20100514
2011-05-14 22:51
405 查看
//服务器
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <arpa/inet.h>
5 #include <unistd.h>
6 #include <stdlib.h>
7 #include <string.h>
8
9 #define SERV_IP "127.0.0.1" //本机IP
10 #define SERV_PORT 8000
11
12 struct ARG{
13 int connfd;
14 struct sockaddr_in client;
15 int other;
16 };
17
18 void *function(void *arg);
19 void sys_err(char* err)
20 {
21 perror(err);
22 exit(1);
23 }
24 int main(void)
25 {
26 int sock_fd;
27 int connfd;
28 int ret;
29 socklen_t addrlen;
30 struct ARG * arg;
31 pthread_t tid;
32
33 struct sockaddr_in cli_addr;
34 struct sockaddr_in serv_addr;
35
36 memset(&serv_addr, 0, sizeof(serv_addr));
37 serv_addr.sin_family = AF_INET;
38 serv_addr.sin_port = htons(SERV_PORT);
39 // serv_addr.sin_addr.s_addr = inet_addr(SERV_IP);
40 inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr);
41
42 sock_fd = socket(AF_INET, SOCK_STREAM, 0);
43 if(sock_fd == -1)
44 sys_err("fail to socket");
45 int opt = SO_REUSEADDR;
46 setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
47 ret = bind(sock_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
48 if(ret == -1)
49 sys_err("fail to bind");
50
51 ret = listen(sock_fd, 20);
52 if(ret == -1)
53 sys_err("fail to listen");
54 //net_fd = accept(sock_fd, (struct sockaddr* )&cli_addr, &addrlen);
55 //if(net_fd == -1)
56 // sys_err("fail to accept");
57
58 char buf[1024];
59 int readsize;
60 while(1)
61 {
62 if((connfd = accept(sock_fd, (struct sockaddr*)&cli_addr, &addrlen)) == -1)
63 sys_err("fail to accept");
64 arg = (struct ARG *)malloc(sizeof(struct ARG));
65 arg->client = cli_addr;
66 arg->connfd = connfd;
67
68 if(pthread_create(&tid, NULL, function, (void *)arg))
69 sys_err("pthread create error");
70
71
72
73
74
75 }
76
77 close(sock_fd);
78
79 return 0;
80 }
81
82 void *function(void *arg)
83 {
84 int net_fd;
85 int num;
86 char buf[1024];
87 struct sockaddr_in client;
88
89 net_fd = ((struct ARG *)arg)->connfd;
90 client = ((struct ARG *)arg)->client;
91
92 while(1)
93 {
94 num = recv(net_fd, buf, 1024, 0);
95 if(num == 0)
96 {
97 printf("the client<%s> exit/n", inet_ntoa(client.sin_addr));
98 break;
99 }
100 printf("You got message from client:%s/n", inet_ntoa(client.sin_addr));
101
102 write(STDOUT_FILENO, buf, num);
103
104 }
105 free(arg);
106 close(net_fd);
107 pthread_exit(NULL);
108 }
//客户端
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <arpa/inet.h>
4 #include <sys/socket.h>
5 #include <sys/types.h>
6 #include <stdlib.h>
7 #include <string.h>
8
9 #define SERV_IP "127.0.0.1"
10 #define SERV_PORT 8000
11
12 void sys_err(char* err)
13 {
14 perror(err);
15 exit(0);
16 }
17 int main(void)
18 {
19 int sockfd;
20 int ret;
21
22 struct sockaddr_in serv_addr;
23 memset(&serv_addr, 0, sizeof(serv_addr));
24 serv_addr.sin_family = AF_INET;
25 serv_addr.sin_port = htons(SERV_PORT);
26 serv_addr.sin_addr.s_addr = inet_addr(SERV_IP);
27
28 sockfd = socket(AF_INET, SOCK_STREAM, 0);
29 if(sockfd == -1)
30 sys_err("fail to socket");
31 ret = connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
32 if(ret == -1)
33 sys_err("fail to connect");
34 char buf[1024];
35 int readsize;
36
37 while(1)
38 {
39 readsize = read(STDIN_FILENO, buf, 1024);
40 if(strncmp(buf, "exit", 4) == 0)
41 {
42 printf("client has exited");
43 break;
44 }
45
46 write(sockfd, buf, readsize);
47 }
48 close(sockfd);
49
50 }
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <arpa/inet.h>
5 #include <unistd.h>
6 #include <stdlib.h>
7 #include <string.h>
8
9 #define SERV_IP "127.0.0.1" //本机IP
10 #define SERV_PORT 8000
11
12 struct ARG{
13 int connfd;
14 struct sockaddr_in client;
15 int other;
16 };
17
18 void *function(void *arg);
19 void sys_err(char* err)
20 {
21 perror(err);
22 exit(1);
23 }
24 int main(void)
25 {
26 int sock_fd;
27 int connfd;
28 int ret;
29 socklen_t addrlen;
30 struct ARG * arg;
31 pthread_t tid;
32
33 struct sockaddr_in cli_addr;
34 struct sockaddr_in serv_addr;
35
36 memset(&serv_addr, 0, sizeof(serv_addr));
37 serv_addr.sin_family = AF_INET;
38 serv_addr.sin_port = htons(SERV_PORT);
39 // serv_addr.sin_addr.s_addr = inet_addr(SERV_IP);
40 inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr);
41
42 sock_fd = socket(AF_INET, SOCK_STREAM, 0);
43 if(sock_fd == -1)
44 sys_err("fail to socket");
45 int opt = SO_REUSEADDR;
46 setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
47 ret = bind(sock_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
48 if(ret == -1)
49 sys_err("fail to bind");
50
51 ret = listen(sock_fd, 20);
52 if(ret == -1)
53 sys_err("fail to listen");
54 //net_fd = accept(sock_fd, (struct sockaddr* )&cli_addr, &addrlen);
55 //if(net_fd == -1)
56 // sys_err("fail to accept");
57
58 char buf[1024];
59 int readsize;
60 while(1)
61 {
62 if((connfd = accept(sock_fd, (struct sockaddr*)&cli_addr, &addrlen)) == -1)
63 sys_err("fail to accept");
64 arg = (struct ARG *)malloc(sizeof(struct ARG));
65 arg->client = cli_addr;
66 arg->connfd = connfd;
67
68 if(pthread_create(&tid, NULL, function, (void *)arg))
69 sys_err("pthread create error");
70
71
72
73
74
75 }
76
77 close(sock_fd);
78
79 return 0;
80 }
81
82 void *function(void *arg)
83 {
84 int net_fd;
85 int num;
86 char buf[1024];
87 struct sockaddr_in client;
88
89 net_fd = ((struct ARG *)arg)->connfd;
90 client = ((struct ARG *)arg)->client;
91
92 while(1)
93 {
94 num = recv(net_fd, buf, 1024, 0);
95 if(num == 0)
96 {
97 printf("the client<%s> exit/n", inet_ntoa(client.sin_addr));
98 break;
99 }
100 printf("You got message from client:%s/n", inet_ntoa(client.sin_addr));
101
102 write(STDOUT_FILENO, buf, num);
103
104 }
105 free(arg);
106 close(net_fd);
107 pthread_exit(NULL);
108 }
//客户端
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <arpa/inet.h>
4 #include <sys/socket.h>
5 #include <sys/types.h>
6 #include <stdlib.h>
7 #include <string.h>
8
9 #define SERV_IP "127.0.0.1"
10 #define SERV_PORT 8000
11
12 void sys_err(char* err)
13 {
14 perror(err);
15 exit(0);
16 }
17 int main(void)
18 {
19 int sockfd;
20 int ret;
21
22 struct sockaddr_in serv_addr;
23 memset(&serv_addr, 0, sizeof(serv_addr));
24 serv_addr.sin_family = AF_INET;
25 serv_addr.sin_port = htons(SERV_PORT);
26 serv_addr.sin_addr.s_addr = inet_addr(SERV_IP);
27
28 sockfd = socket(AF_INET, SOCK_STREAM, 0);
29 if(sockfd == -1)
30 sys_err("fail to socket");
31 ret = connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
32 if(ret == -1)
33 sys_err("fail to connect");
34 char buf[1024];
35 int readsize;
36
37 while(1)
38 {
39 readsize = read(STDIN_FILENO, buf, 1024);
40 if(strncmp(buf, "exit", 4) == 0)
41 {
42 printf("client has exited");
43 break;
44 }
45
46 write(sockfd, buf, readsize);
47 }
48 close(sockfd);
49
50 }
相关文章推荐
- JAVA程序设计(19)----- 查询信息的服务器 客户端设立 支持并发多线程
- 利用多线程编写多个客户端向服务器并发数据
- 黑马程序员-TCP上传图片-多线程并发上传图片-客户端并发登陆-自定义服务器
- 流式(TCP)套接字客户端/服务器编程 (多线程并发服务器)
- 查询信息的服务器 客户端设立 支持并发多线程
- 多进程并发服务器与客户端 ----20100514
- socket客户端服务器通信(多线程)
- java新手笔记33 多线程、客户端、服务器
- 基于非阻塞socket的多线程服务器的实现------一个服务器如何与多个客户端进行通信?
- 常见多线程并发服务器编程模型
- 关于并发服务器父进程对connfd调用close时没有终止服务器与客户端的链接解释
- iOS从零开始学习socket编程——高并发多线程服务器
- python多进程、多线程服务器和客户端的简单实现
- 高性能、高并发TCP服务器(多线程调用libevent)
- 常见多线程与并发服务器设计方案举例
- Linux C——TCP并发服务器客户端(线程实现)
- Java多线程实现多个客户端同时与服务器进行TCP通信
- Linux select 实现并发服务器和客户端
- 常见多线程与并发服务器设计方案举例
- TCP多线程并发服务器+线程池+echo