歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux下基於TCP簡單的Socket通信程序

Linux下基於TCP簡單的Socket通信程序

日期:2017/3/1 11:08:44   编辑:Linux編程
服務器端程序:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <strings.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <unistd.h>
  7. #include <arpa/inet.h>
  8. #include <netinet/in.h>
  9. #include <string.h>
  10. #include <errno.h>
  11. #define PORT 2370
  12. #define BACKLOG 2
  13. #define IP "192.168.1.12"
  14. void process_conn_server(int s,char * ip);
  15. int main(int argc,char *argv[])
  16. {
  17. int ss,sc;
  18. struct sockaddr_in server_addr;
  19. struct sockaddr_in client_addr;
  20. int err;
  21. pid_t pid;
  22. //創建套接字
  23. ss=socket(AF_INET,SOCK_STREAM,0);
  24. if(ss<0)
  25. {
  26. printf("socket error\n");
  27. return -1;
  28. }
  29. //設置服務器端的地址,端口等
  30. server_addr.sin_family = AF_INET;
  31. server_addr.sin_port = htons(PORT);
  32. server_addr.sin_addr.s_addr = INADDR_ANY;
  33. bzero(&(server_addr.sin_zero), 8);
  34. //將創建的套接字綁定到服務器端
  35. err = bind(ss, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
  36. if(err<0)
  37. {
  38. printf("bind error\n");
  39. return -1;
  40. }
  41. //監聽套接字
  42. err=listen(ss,BACKLOG);
  43. if(err<0)
  44. {
  45. printf("listen error\n");
  46. return -1;
  47. }
  48. //主循環程序
  49. for(;;)
  50. {
  51. int addrlen=sizeof(struct sockaddr);
  52. sc=accept(ss,(struct sockaddr*)&client_addr,&addrlen);//如果調用成功,www.linuxidc.com將返回一個新的套接字與客戶端通信
  53. printf("%s has connected success\n",inet_ntoa(client_addr.sin_addr));
  54. if(sc<0)
  55. {
  56. continue;
  57. }
  58. pid=fork();//創建一個進程與客戶端通信
  59. if(pid==0)
  60. {
  61. close(ss);//為了避免影響,在子進程中關閉父進程套接字,父進程關閉子進程的套接字(並沒有真正的關閉,只是讓它們不相互影響)
  62. process_conn_server(sc,inet_ntoa(client_addr.sin_addr));//調用子進程通信函數
  63. }
  64. else
  65. {
  66. close(sc);
  67. }
  68. }
  69. }
  70. void process_conn_server(int s,char *ip)
  71. {
  72. char buffer[1024];
  73. while(1)
  74. {
  75. memset(buffer,'\0',1024); //置空
  76. recv(s,buffer,1024,0);//接收消息www.linuxidc.com
  77. if(strncmp("end",buffer,3)==0)//判斷是否符合退出條件
  78. {
  79. printf("%s has lost connect\n",ip);
  80. close(s);
  81. exit(EXIT_SUCCESS);
  82. }
  83. printf("%s say :%s\n",ip,buffer);
  84. //統計客戶端輸出的字符個數並發送給客戶端
  85. sprintf(buffer,"%d characters altogether",strlen(buffer)-1);
  86. send(s,buffer,1024,0);
  87. }
  88. }
Copyright © Linux教程網 All Rights Reserved