客服端

  1. // 
  2.  
  3. // main.cpp 
  4.  
  5. // hello_client 
  6.  
  7. // 
  8.  
  9. // Created by app05 on 15-10-22. 
  10.  
  11. // Copyright (c) 2015年 app05. All rights reserved. 
  12.  
  13. // 
  14.  
  15. // 
  16.  
  17. #include 
  18.  
  19. #include 
  20.  
  21. #include 
  22.  
  23. #include 
  24.  
  25. #include 
  26.  
  27. #include 
  28.  
  29. #include 
  30.  
  31. #define BUF_SIZE 100 
  32.  
  33. #define NAME_SIZE 20 
  34.  
  35. void * send_msg(void * arg); 
  36.  
  37. void * recv_msg(void * arg); 
  38.  
  39. void error_handling(char *message); 
  40.  
  41. char name[NAME_SIZE] = "[DEFAULT]"
  42.  
  43. char msg[BUF_SIZE]; 
  44.  
  45. int main(int argc, const char * argv[]) { 
  46.  
  47. int sock; 
  48.  
  49. struct sockaddr_in serv_addr; 
  50.  
  51. pthread_t snd_thread, rcv_thread; 
  52.  
  53. void * thread_return; 
  54.  
  55. if(argc != 4) 
  56.  
  57.  
  58. printf("Usage: %s \n", argv[0]); 
  59.  
  60. exit(1); 
  61.  
  62.  
  63. sprintf(name, "[%s]", argv[3]); //聊天人名字,配置到编译器参数里 
  64.  
  65. sock = socket(PF_INET, SOCK_STREAM, 0); 
  66.  
  67. if(sock == -1) 
  68.  
  69. error_handling("socket() error"); 
  70.  
  71. memset(&serv_addr, 0, sizeof(serv_addr)); 
  72.  
  73. serv_addr.sin_family = AF_INET; 
  74.  
  75. serv_addr.sin_addr.s_addr = inet_addr(argv[1]); 
  76.  
  77. serv_addr.sin_port = htons(atoi(argv[2])); 
  78.  
  79. if (connect(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) == -1) 
  80.  
  81. error_handling("connect() error"); 
  82.  
  83. //多线程分离输入和输出 
  84.  
  85. pthread_create(&snd_thread, NULL, send_msg, (void *)&sock); 
  86.  
  87. pthread_create(&rcv_thread, NULL, recv_msg, (void *)&sock); 
  88.  
  89. //阻塞,等待返回 
  90.  
  91. pthread_join(snd_thread, &thread_return); 
  92.  
  93. pthread_join(rcv_thread, &thread_return); 
  94.  
  95. close(sock); 
  96.  
  97. return 0; 
  98.  
  99.  
  100. //发送消息 
  101.  
  102. void * send_msg(void * arg) 
  103.  
  104.  
  105. int sock = *((int *)arg); 
  106.  
  107. char name_msg[NAME_SIZE + BUF_SIZE]; 
  108.  
  109. while (1) { 
  110.  
  111. fgets(msg, BUF_SIZE, stdin); 
  112.  
  113. if (!strcmp(msg, "q\n") || !strcmp(msg, "Q \n")) { 
  114.  
  115. close(sock); 
  116.  
  117. exit(0); 
  118.  
  119.  
  120. sprintf(name_msg, "%s %s", name, msg); 
  121.  
  122. write(sock, name_msg, strlen(name_msg)); 
  123.  
  124.  
  125. return NULL; 
  126.  
  127.  
  128. //接收消息 
  129.  
  130. void * recv_msg(void * arg) 
  131.  
  132.  
  133. int sock = *((int *)arg); 
  134.  
  135. char name_msg[NAME_SIZE + BUF_SIZE]; 
  136.  
  137. int str_len; 
  138.  
  139. while (1) { 
  140.  
  141. str_len = read(sock, name_msg, NAME_SIZE + BUF_SIZE - 1); 
  142.  
  143. if(str_len == -1) 
  144.  
  145. return (void *)-1; 
  146.  
  147. name_msg[str_len] = 0; 
  148.  
  149. fputs(name_msg, stdout); 
  150.  
  151.  
  152. return NULL; 
  153.  
  154.  
  155. void error_handling(char *message) 
  156.  
  157.  
  158. fputs(message, stderr); 
  159.  
  160. fputc('\n', stderr); 
  161.  
  162. exit(1); 
  163.  
  164. }

 TCP/IP网络编程 多线程服务器端的实现

 TCP/IP网络编程 多线程服务器端的实现

 TCP/IP网络编程 多线程服务器端的实现




相关内容