歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux下基於TCP的文件傳輸

Linux下基於TCP的文件傳輸

日期:2017/3/1 11:08:44   编辑:Linux編程

服務器:

  1. #include <netinet/in.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <time.h>
  7. #include <string.h>
  8. #define SERVER_PORT 6666
  9. #define LISTEN_QUEUE 20
  10. #define BUFFER_SIZE 1024
  11. int main(int argc,char **argv)
  12. {
  13. struct sockaddr_in server_addr;
  14. bzero(&server_addr,sizeof(server_addr));//全部置零
  15. //設置地址相關的屬性
  16. server_addr.sin_family=AF_INET;
  17. server_addr.sin_addr.s_addr=htons(INADDR_ANY);
  18. server_addr.sin_port=htons(SERVER_PORT);
  19. //創建套接字
  20. int server_socket=socket(AF_INET,SOCK_STREAM,0);
  21. if(server_socket<0)
  22. {
  23. printf("socket create error\n");
  24. exit(1);
  25. }
  26. //綁定端口
  27. if(bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
  28. {
  29. printf("bind error\n");
  30. exit(1);
  31. }
  32. //服務器端監聽
  33. if(listen(server_socket,LISTEN_QUEUE))
  34. {
  35. printf("Server listen error\n");
  36. exit(1);
  37. }
  38. //服務器端一直運行
  39. while(1)
  40. {
  41. pid_t pid;
  42. struct sockaddr_in client_addr;
  43. socklen_t length=sizeof(client_addr);
  44. //accept返回一個新的套接字與www.linuxidc.com客戶端進行通信
  45. int new_server_socket=accept(server_socket,(struct sockaddr*)&client_addr,&length);
  46. //1*begin******************************************************************************
  47. if(new_server_socket==-1)
  48. {
  49. printf("accept error\n");
  50. continue;
  51. }
  52. else
  53. {
  54. printf("客戶端%s連接成功\n",inet_ntoa(client_addr.sin_addr));
  55. pid=fork();
  56. //3*begin**運行子進程*************************************************************
  57. if(pid==0)
  58. {
  59. int data_len,flag=0;
  60. char buffer[BUFFER_SIZE];
  61. // 定義文件流
  62. FILE *stream;
  63. bzero(buffer,BUFFER_SIZE);
  64. strcpy(buffer,"請輸入要傳輸的文件的完整路徑:");
  65. strcat(buffer,"\n");
  66. send(new_server_socket,buffer,BUFFER_SIZE,0);
  67. bzero(buffer,BUFFER_SIZE);
  68. //2*begin**服務器接受數據*********************************************
  69. if((stream=fopen("data","w"))==NULL)
  70. {
  71. printf("file open error\n");
  72. exit(1);
  73. }
  74. else
  75. {
  76. bzero(buffer,BUFFER_SIZE);
  77. }
  78. // printf("正在接收來自%s的文件....\n",inet_ntoa(client_addr.sin_addr));
  79. //先將數據接受到緩沖區buffer中,再寫入到新建的文件中
  80. while(data_len=recv(new_server_socket,buffer,BUFFER_SIZE,0))
  81. {
  82. flag++;
  83. if(flag==1)
  84. {
  85. printf("正在接收來自%s的文件....\n",inet_ntoa(client_addr.sin_addr));
  86. }
  87. if(data_len<0)
  88. {
  89. printf("接收錯誤\n");
  90. exit(1);
  91. }
  92. //向文件中寫入數據
  93. int write_len=fwrite(buffer,sizeof(char),data_len,stream);
  94. if(write_len>data_len)
  95. {
  96. printf("file write failed\n");
  97. exit(1);
  98. }
  99. bzero(buffer,BUFFER_SIZE);
  100. }
  101. if(flag>0)
  102. printf("%s的文件傳送完畢\n",inet_ntoa(client_addr.sin_addr));
  103. if(flag==0)
  104. printf("%s的文件傳輸失敗\n",inet_ntoa(client_addr.sin_addr));
  105. //2*end**服務器接受數據****************************************************
  106. // rename("data",inet_ntoa(client_addr.sin_addr));
  107. fclose(stream);
  108. rename("data",inet_ntoa(client_addr.sin_addr));
  109. exit(1);
  110. }
  111. //3*end**運行子進程**********************************************************
  112. else
  113. {
  114. close(new_server_socket);
  115. }
  116. }
  117. //1*end**************************************************************************************
  118. close(new_server_socket);
  119. }
  120. return 0;
  121. }
Copyright © Linux教程網 All Rights Reserved