Linux下基于socket多线程并发通信的实现

Linux下基于socket多线程并发通信的实现

分类: Linux2011-05-21 18:13 8455人阅读 评论(5) 收藏 举报socket多线程linuxserverstruct服务器[cpp] view plaincopy

  1. /***************************************************
  2. * 文件名:pthread_server.c
  3. * 文件描述:创建子线程来接收客户端的数据
  4. ***************************************************/
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <stdio.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>
  10. #include <unistd.h>
  11. #include <stdlib.h>
  12. #include <pthread.h>
  13. void *rec_data(void *fd);
  14. int main(int argc,char *argv[])
  15. {
  16. int server_sockfd;
  17. int *client_sockfd;
  18. int server_len, client_len;
  19. struct sockaddr_in server_address;
  20. struct sockaddr_in client_address;
  21. struct sockaddr_in tempaddr;
  22. int i,byte;
  23. char char_recv,char_send;
  24. socklen_t templen;
  25. server_sockfd = socket(AF_INET, SOCK_STREAM, 0);//创建套接字
  26. server_address.sin_family = AF_INET;
  27. server_address.sin_addr.s_addr = htonl(INADDR_ANY);
  28. server_address.sin_port = htons(9734);
  29. server_len = sizeof(server_address);
  30. bind(server_sockfd, (struct sockaddr *)&server_address, server_len);//绑定套接字
  31. templen = sizeof(struct sockaddr);
  32. printf("server waiting for connect/n");
  33. while(1){
  34. pthread_t thread;//创建不同的子线程以区别不同的客户端
  35. client_sockfd = (int *)malloc(sizeof(int));
  36. client_len = sizeof(client_address);
  37. *client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, (socklen_t *)&client_len);
  38. if(-1==*client_sockfd){
  39. perror("accept");
  40. continue;
  41. }
  42. if(pthread_create(&thread, NULL, rec_data, client_sockfd)!=0)//创建子线程
  43. {
  44. perror("pthread_create");
  45. break;
  46. }
  47. }
  48. shutdown(*client_sockfd,2);
  49. shutdown(server_sockfd,2);
  50. }
  51. /*****************************************
  52. * 函数名称:rec_data
  53. * 功能描述:接受客户端的数据
  54. * 参数列表:fd——连接套接字
  55. * 返回结果:void
  56. *****************************************/
  57. void *rec_data(void *fd)
  58. {
  59. int client_sockfd;
  60. int i,byte;
  61. char char_recv[100];//存放数据
  62. client_sockfd=*((int*)fd);
  63. for(;;)
  64. {
  65. if((byte=recv(client_sockfd,char_recv,100,0))==-1)
  66. {
  67. perror("recv");
  68. exit(EXIT_FAILURE);
  69. }
  70. if(strcmp(char_recv, "exit")==0)//接受到exit时,跳出循环
  71. break;
  72. printf("receive from client is %s/n",char_recv);//打印收到的数据
  73. }
  74. free(fd);
  75. close(client_sockfd);
  76. pthread_exit(NULL);
  77. }
  78. /***************************************************
  79. * 文件名:pthread_client.c
  80. * 文件描述:创建子线程来接收客户端的数据
  81. ***************************************************/
  82. #include <sys/types.h>
  83. #include <sys/socket.h>
  84. #include <stdio.h>
  85. #include <netinet/in.h>
  86. #include <arpa/inet.h>
  87. #include <unistd.h>
  88. #include <stdlib.h>
  89. int main(int argc,char *argv[])
  90. {
  91. int sockfd;
  92. int len;
  93. struct sockaddr_in address;
  94. int result;
  95. int i,byte;
  96. char char_send[100] = { 0 };
  97. if((sockfd = socket(AF_INET, SOCK_STREAM, 0))==-1)
  98. {
  99. perror("socket");
  100. exit(EXIT_FAILURE);
  101. }
  102. if(argc != 3){
  103. printf("Usage: fileclient <address> <port>/n");//用法:文件名 服务器IP地址 服务器端口地址
  104. return 0;
  105. }
  106. if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){
  107. perror("sock");
  108. exit(1);
  109. }
  110. bzero(&address,sizeof(address));
  111. address.sin_family = AF_INET;
  112. address.sin_port = htons(atoi(argv[2]));
  113. inet_pton(AF_INET,argv[1],&address.sin_addr);
  114. len = sizeof(address);
  115. if((result = connect(sockfd, (struct sockaddr *)&address, len))==-1)
  116. {
  117. perror("connect");
  118. exit(EXIT_FAILURE);
  119. }
  120. for(;;)
  121. {
  122. scanf("%s", char_send);//输入发送数据
  123. fflush(stdin);//清除输入缓存
  124. if(strcmp(char_send, "exit")==0){//如果输入exit,跳出循环
  125. if((byte=send(sockfd,char_send,100,0))==-1)
  126. {
  127. perror("send");
  128. exit(EXIT_FAILURE);
  129. }
  130. break;
  131. }
  132. if((byte=send(sockfd,char_send,100,0))==-1)
  133. {
  134. perror("send");
  135. exit(EXIT_FAILURE);
  136. }
  137. }
  138. close(sockfd);
  139. exit(0);
  140. }

编译服务器端程序 pthread_server.c :

$gcc pthread_server.c –o server –lpthread

编译客户端程序 pthread_client.c:

$gcc pthread_client.c –o client

编译在开发板上跑的客户端程序:

$arm-linux-gcc client.c –o arm_client

先启动服务器端的程序 server:

$./server

打开另一个终端,启动客户端的程序 client:

$./client 127.0.0.1 9734

把 arm_client 放到开发板上,启动 arm_client:

$./arm_client 219.222.170.9 9734

结果 :

服务器端:

tongs@tong's-desktop:~/c_c++_program/sock_inet_comm2$ ./server

server waiting for connect

receive from client is client

receive from client is client

receive from client is arm_client

receive from client is arm_client

客户端:

tongs@tong's-desktop:~/c_c++_program/sock_inet_comm2$ ./client 127.0.0.1 9734

client

client

exit

开发板服务器端

[/mnt/yaffs/nfs_share/sock_tcp/thread_socket]./arm_client 219.222.170.9 9734

arm_client

arm_client

exit

(0)

相关推荐

  • 如何在Linux 下基于PC 进行 PROFIBUS 通信测试

    DF PROFI II,这款高性能PROFIBUS DP/DPV1接口板,作为PCI.PCI-Express.CompactPCI和PC104+接口板卡, DF PROFI II广泛应用于各种领域.因 ...

  • Linux下如何实现shell多线程编程以提高应用程序的响应

    Linux中多线程编程拥有提高应用程序的响应、使多cpu系统更加有效等优点,下面小编将通过Linux下shell多线程编程的例子给大家讲解下多线程编程的过程,一起来了解下吧。 #!/bin/bash ...

  • Linux下的多线程编程和fork()函数详解

     一.fork()函数 在操作系统的基本概念中进程是程序的一次执行,且是拥有资源的最小单位和调度单位(在引入线程的操作系统中,线程是最小的调度单位).在Linux系统中 创建进程有两种方式:一是由操作 ...

  • Linux下一个简单的多线程互斥锁的例子

    本篇文章是对Linux下一个简单的多线程互斥锁的例子进行了分析介绍,需要的朋友可以参考下 复制代码 代码如下: #include <stdio.h> #include <pthrea ...

  • linux下进程间通信方式有哪些

    以linux操作系统为例(window也类似),linux下进程间通信方式如下: 操作方法 01 管道(Pipe)及有名管道(namedpipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了 ...

  • Linux下的用户管理总结(含禁止用户和IP登录的方法)

    在Linux中,用户的管理分为组和用户两种。这个Windows下也是这个样子,组是一类用户的统称。组和用户的关系是:多对多的关系。即用户可以存在于多个组中,组中也可以有多个用户。组的权限会被赋予组中的 ...

  • Linux下自动清理大量文件的方案探究

    定期清理过期文件和垃圾文件,维持文件系统合理的空间使用率,是一个系统管理员的日常工作.对于中小规模文件系统而言,简单的系统命令或者脚本都就可以实现;但是对于拥有数亿甚至数十亿数文件的大型.超大型文件系 ...

  • Linux下的命令行串口工具minicom安装和使用教程

    Linux下的Minicom的功能与Windows下的超级终端功能相似,可以通过串口控制外部的硬件 设备.适于在linux通过超级终端对嵌入式设备行管理.同样也可以使用minicom对外置Modem进 ...

  • java如何多线程并发访问解决方案

    synchronized关键字主要解决多线程共享数据同步问题. ThreadLocal使用场合主要解决多线程中数据因并发产生不一致问题. ThreadLocal和Synchonized都用于解决多线程 ...