linux进程与线程练习,linux套接字编程之多进程多线程练习

一.概述:本次练习的是linux下的TAP/IP套接字多进程与多线程编程,功能只实现了对话。话不多说,直接上代码。

二.多进程:

server.c:1 /****************************************

2     > File Name:server.c

3     > Author:xiaoxiaohui

4     > mail:1924224891@qq.com

5     > Created Time:2016年05月15日 星期日 16时06分03秒

6 ****************************************/

7

8 #include

9 #include

10 #include

11 #include

12 #include

13 #include 

14 #include

15 #include

16 #include

17 #include

18

19 #define LEN 1024

20 const int PORT = 8080;

21 int listenSock, linkSock;

22 struct sockaddr_in lockal;

23 struct sockaddr_in client;

24 char buf[LEN];

25

26

27 void ListenSock()    //建立一个已链接套接字

28 {

29     listenSock = socket(AF_INET, SOCK_STREAM, 0);   //返回一个文件描述符

30

31     lockal.sin_family = AF_INET;

32     lockal.sin_addr.s_addr = htonl(INADDR_ANY);    //适合多网卡

33     lockal.sin_port = htons(PORT);

34     if( bind(listenSock, (struct sockaddr*)&lockal, sizeof(lockal)) 

35     {

36         perror("bind");

37         exit(0);

38     }

39

40     if( listen(listenSock, 5) 

41     {

42         perror("listen");

43         exit(1);

44     }

45 }

46

47 void LinkSock()

48 {

49     int size = sizeof(lockal);

50     linkSock = accept(listenSock, (struct sockaddr*)&client, &size);  //创建一个已链接套接字

51     if(linkSock 

52     {

53         perror("accept");

54     }

55     else

56     {

57         printf("connect success ip is :%s port is : %d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));

58     }

59 }

60

61 int main()

62 {

63     ListenSock();

64     while(1)

65     {

66         LinkSock();

67

68         pid_t pid = fork();

69

70         if(pid == 0)

71         {

72             close(listenSock);

73             while(1)

74             {

75                 int ret = 0;

76                 ret = read(linkSock, buf, LEN);

77                 buf[ret] = '\0';

78                 printf("client->ip:%s port: %d  #%s\n",inet_ntoa(client.sin_addr),\

79                         ntohs(client.sin_port), buf);

80             }

81         }

82         else if(pid > 0)

83         {

84             close(linkSock);

85         }

86         else

87         {

88             perror("fork");

89             continue;

90         }

91     }

92

93     return 0;

94 }

95

96

client.c:1 /****************************************

2     > File Name:client.c

3     > Author:xiaoxiaohui

4     > mail:1924224891@qq.com

5     > Created Time:2016年05月15日 星期日 16时48分21秒

6 ****************************************/

7

8

9 #include

10 #include

11 #include

12 #include

13 #include

14 #include 

15 #include

16 #include

17 #include

18 #include

19 const int PORT = 8080;

20 const int LEN = 1024;

21 int clientSock;

22 struct sockaddr_in server;

23

24

25

26 void LinkSock()  //创建一个以链接套接字

27 {

28     clientSock = socket(AF_INET, SOCK_STREAM, 0);

29

30     server.sin_family = AF_INET;

31     server.sin_addr.s_addr = inet_addr("127.0.0.1");

32     server.sin_port = htons(PORT);

33     if( connect(clientSock, (struct sockaddr*)&server, sizeof(server)) 

34     {

35         perror("connect");

36         exit(0);

37     }

38     else

39     {

40         printf("connect success!   ip:%s  port:%d\n", inet_ntoa(server.sin_addr), ntohs(server.sin_port));

41     }

42 }

43

44 int main()

45 {

46

47     char buf[LEN];

48     LinkSock();     //得到一个已链接套接字

49

50     while(1)

51     {

52         int ret = 0;

53         printf("请选择->");

54         gets(buf);

55

56         write(clientSock, buf, strlen(buf));     //把选择的命令发到服务器

57

58         //memset(buf, '\0', LEN);

59         //ret = read(clientSock, buf, LEN - 1 );   //接受服务器的信息

60         //buf[ret] = '\0';

61         //printf("%s", buf);

62         //printf("\n");

63     }

64

65     return 0;

66 }

67

执行结果:

cc895177a029f5a15ca3630c3a23e41a.png

1ae266e803f43bca9643f5784a53da01.png

三.多线程:

server.c:1 /****************************************

2     > File Name:server.c

3     > Author:xiaoxiaohui

4     > mail:1924224891@qq.com

5     > Created Time:2016年05月15日 星期日 16时06分03秒

6 ****************************************/

7

8 #include

9 #include

10 #include

11 #include

12 #include

13 #include 

14 #include

15 #include

16 #include

17 #include

18 #include

19

20 #define LEN 1024

21 const int PORT = 8080;

22 int listenSock, linkSock;

23 struct sockaddr_in lockal;

24 struct sockaddr_in client;

25 char buf[LEN];

26

27

28 void ListenSock()    //建立一个已链接套接字

29 {

30     listenSock = socket(AF_INET, SOCK_STREAM, 0);   //返回一个文件描述符

31

32     lockal.sin_family = AF_INET;

33     lockal.sin_addr.s_addr = htonl(INADDR_ANY);    //适合多网卡

34     lockal.sin_port = htons(PORT);

35     if( bind(listenSock, (struct sockaddr*)&lockal, sizeof(lockal)) 

36     {

37         perror("bind");

38         exit(0);

39     }

40

41     if( listen(listenSock, 5) 

42     {

43         perror("listen");

44         exit(1);

45     }

46 }

47

48 void LinkSock()

49 {

50     int size = sizeof(lockal);

51     linkSock = accept(listenSock, (struct sockaddr*)&client, &size);  //创建一个已链接套接字

52     if(linkSock 

53     {

54         perror("accept");

55     }

56     else

57     {

58         printf("connect success ip is :%s port is : %d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));

59     }

60 }

61

62 void* RecvMessage(void* ptr)

63 {

64     while(1)

65     {

66         int ret = 0;

67         ret = read(linkSock, buf, LEN);

68         buf[ret] = '\0';

69         printf("client->ip:%s port: %d  #%s\n",inet_ntoa(client.sin_addr),\

70         ntohs(client.sin_port), buf);

71     }

72     return NULL;

73 }

74

75 int main()

76 {

77     ListenSock();

78     while(1)

79     {

80         LinkSock();

81

82         pthread_t tid;

83         int err = pthread_create(&tid, NULL, RecvMessage, NULL);

84         pthread_detach(tid);

85     }

86

87     return 0;

88 }

89

90

client.c:1 /****************************************

2     > File Name:client.c

3     > Author:xiaoxiaohui

4     > mail:1924224891@qq.com

5     > Created Time:2016年05月15日 星期日 16时48分21秒

6 ****************************************/

7

8

9 #include

10 #include

11 #include

12 #include

13 #include

14 #include 

15 #include

16 #include

17 #include

18 #include

19 const int PORT = 8080;

20 const int LEN = 1024;

21 int clientSock;

22 struct sockaddr_in server;

23

24

25

26 void LinkSock()  //创建一个以链接套接字

27 {

28     clientSock = socket(AF_INET, SOCK_STREAM, 0);

29

30     server.sin_family = AF_INET;

31     server.sin_addr.s_addr = inet_addr("127.0.0.1");

32     server.sin_port = htons(PORT);

33     if( connect(clientSock, (struct sockaddr*)&server, sizeof(server)) 

34     {

35         perror("connect");

36         exit(0);

37     }

38     else

39     {

40         printf("connect success!   ip:%s  port:%d\n", inet_ntoa(server.sin_addr), ntohs(server.sin_port));

41     }

42 }

43

44 int main()

45 {

46

47     char buf[LEN];

48     LinkSock();     //得到一个已链接套接字

49

50     while(1)

51     {

52         int ret = 0;

53         printf("请选择->");

54         gets(buf);

55

56         write(clientSock, buf, strlen(buf));     //把选择的命令发到服务器

57

58         //memset(buf, '\0', LEN);

59         //ret = read(clientSock, buf, LEN - 1 );   //接受服务器的信息

60         //buf[ret] = '\0';

61         //printf("%s", buf);

62         //printf("\n");

63     }

64

65     return 0;

66 }

67

执行结果:

765ea39fecd51d4e21f9813d72be6b25.png

b2910201f140b020932a9255545cbf8f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值