您的位置:首页 > 其它

多线程并发服务器与客户端 ---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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: