Linux下使用socket傳輸文件的C語言簡單實現

轉載:http://blog.csdn.net/ljd_1986413/article/details/7940938

服務器程序和客戶端程序應當分別運行在兩臺計算機上。

在運行服務器端的計算機終端執行:./file_server

在運行客戶端的計算終端上執行:./file_client?? ipaddr_server

然后根據提示輸入要傳輸的服務器上的文件,該文件必須在服務器的當前運行目錄中,否則會提示找不到文件。

?

直接上源碼吧:

?

[cpp]?view plaincopy
  1. ??
  2. //?file_server.c?--?socket文件傳輸服務器端示例代碼???
  3. //?/??
  4. #include<netinet/in.h>???
  5. #include<sys/types.h>???
  6. #include<sys/socket.h>???
  7. #include<stdio.h>???
  8. #include<stdlib.h>???
  9. #include<string.h>???
  10. ??
  11. #define?HELLO_WORLD_SERVER_PORT????6666??
  12. #define?LENGTH_OF_LISTEN_QUEUE?????20??
  13. #define?BUFFER_SIZE????????????????1024??
  14. #define?FILE_NAME_MAX_SIZE?????????512??
  15. ??
  16. int?main(int?argc,?char?**argv)??
  17. {??
  18. ????//?set?socket's?address?information???
  19. ????//?設置一個socket地址結構server_addr,代表服務器internet的地址和端口??
  20. ????struct?sockaddr_in???server_addr;??
  21. ????bzero(&server_addr,?sizeof(server_addr));??
  22. ????server_addr.sin_family?=?AF_INET;??
  23. ????server_addr.sin_addr.s_addr?=?htons(INADDR_ANY);??
  24. ????server_addr.sin_port?=?htons(HELLO_WORLD_SERVER_PORT);??
  25. ??
  26. ????//?create?a?stream?socket???
  27. ????//?創建用于internet的流協議(TCP)socket,用server_socket代表服務器向客戶端提供服務的接口??
  28. ????int?server_socket?=?socket(PF_INET,?SOCK_STREAM,?0);??
  29. ????if?(server_socket?<?0)??
  30. ????{??
  31. ????????printf("Create?Socket?Failed!\n");??
  32. ????????exit(1);??
  33. ????}??
  34. ??
  35. ????//?把socket和socket地址結構綁定???
  36. ????if?(bind(server_socket,?(struct?sockaddr*)&server_addr,?sizeof(server_addr)))??
  37. ????{??
  38. ????????printf("Server?Bind?Port:?%d?Failed!\n",?HELLO_WORLD_SERVER_PORT);??
  39. ????????exit(1);??
  40. ????}??
  41. ??
  42. ????//?server_socket用于監聽???
  43. ????if?(listen(server_socket,?LENGTH_OF_LISTEN_QUEUE))??
  44. ????{??
  45. ????????printf("Server?Listen?Failed!\n");??
  46. ????????exit(1);??
  47. ????}??
  48. ??
  49. ????//?服務器端一直運行用以持續為客戶端提供服務???
  50. ????while(1)??
  51. ????{??
  52. ????????//?定義客戶端的socket地址結構client_addr,當收到來自客戶端的請求后,調用accept??
  53. ????????//?接受此請求,同時將client端的地址和端口等信息寫入client_addr中??
  54. ????????struct?sockaddr_in?client_addr;??
  55. ????????socklen_t??????????length?=?sizeof(client_addr);??
  56. ??
  57. ????????//?接受一個從client端到達server端的連接請求,將客戶端的信息保存在client_addr中??
  58. ????????//?如果沒有連接請求,則一直等待直到有連接請求為止,這是accept函數的特性,可以??
  59. ????????//?用select()來實現超時檢測???
  60. ????????//?accpet返回一個新的socket,這個socket用來與此次連接到server的client進行通信??
  61. ????????//?這里的new_server_socket代表了這個通信通道??
  62. ????????int?new_server_socket?=?accept(server_socket,?(struct?sockaddr*)&client_addr,?&length);??
  63. ????????if?(new_server_socket?<?0)??
  64. ????????{??
  65. ????????????printf("Server?Accept?Failed!\n");??
  66. ????????????break;??
  67. ????????}??
  68. ??
  69. ????????char?buffer[BUFFER_SIZE];??
  70. ????????bzero(buffer,?sizeof(buffer));??
  71. ????????length?=?recv(new_server_socket,?buffer,?BUFFER_SIZE,?0);??
  72. ????????if?(length?<?0)??
  73. ????????{??
  74. ????????????printf("Server?Recieve?Data?Failed!\n");??
  75. ????????????break;??
  76. ????????}??
  77. ??
  78. ????????char?file_name[FILE_NAME_MAX_SIZE?+?1];??
  79. ????????bzero(file_name,?sizeof(file_name));??
  80. ????????strncpy(file_name,?buffer,??
  81. ????????????????strlen(buffer)?>?FILE_NAME_MAX_SIZE???FILE_NAME_MAX_SIZE?:?strlen(buffer));??
  82. ??
  83. ????????FILE?*fp?=?fopen(file_name,?"r");??
  84. ????????if?(fp?==?NULL)??
  85. ????????{??
  86. ????????????printf("File:\t%s?Not?Found!\n",?file_name);??
  87. ????????}??
  88. ????????else??
  89. ????????{??
  90. ????????????bzero(buffer,?BUFFER_SIZE);??
  91. ????????????int?file_block_length?=?0;??
  92. ????????????while(?(file_block_length?=?fread(buffer,?sizeof(char),?BUFFER_SIZE,?fp))?>?0)??
  93. ????????????{??
  94. ????????????????printf("file_block_length?=?%d\n",?file_block_length);??
  95. ??
  96. ????????????????//?發送buffer中的字符串到new_server_socket,實際上就是發送給客戶端??
  97. ????????????????if?(send(new_server_socket,?buffer,?file_block_length,?0)?<?0)??
  98. ????????????????{??
  99. ????????????????????printf("Send?File:\t%s?Failed!\n",?file_name);??
  100. ????????????????????break;??
  101. ????????????????}??
  102. ??
  103. ????????????????bzero(buffer,?sizeof(buffer));??
  104. ????????????}??
  105. ????????????fclose(fp);??
  106. ????????????printf("File:\t%s?Transfer?Finished!\n",?file_name);??
  107. ????????}??
  108. ??
  109. ????????close(new_server_socket);??
  110. ????}??
  111. ??
  112. ????close(server_socket);??
  113. ??
  114. ????return?0;??
  115. }??
[cpp]?view plain?copy
  1. ??
  2. //?file_server.c?--?socket文件傳輸服務器端示例代碼??
  3. //?/??
  4. #include<netinet/in.h>??
  5. #include<sys/types.h>??
  6. #include<sys/socket.h>??
  7. #include<stdio.h>??
  8. #include<stdlib.h>??
  9. #include<string.h>??
  10. ??
  11. #define?HELLO_WORLD_SERVER_PORT????6666??
  12. #define?LENGTH_OF_LISTEN_QUEUE?????20??
  13. #define?BUFFER_SIZE????????????????1024??
  14. #define?FILE_NAME_MAX_SIZE?????????512??
  15. ??
  16. int?main(int?argc,?char?**argv)??
  17. {??
  18. ????//?set?socket's?address?information??
  19. ????//?設置一個socket地址結構server_addr,代表服務器internet的地址和端口??
  20. ????struct?sockaddr_in???server_addr;??
  21. ????bzero(&server_addr,?sizeof(server_addr));??
  22. ????server_addr.sin_family?=?AF_INET;??
  23. ????server_addr.sin_addr.s_addr?=?htons(INADDR_ANY);??
  24. ????server_addr.sin_port?=?htons(HELLO_WORLD_SERVER_PORT);??
  25. ??
  26. ????//?create?a?stream?socket??
  27. ????//?創建用于internet的流協議(TCP)socket,用server_socket代表服務器向客戶端提供服務的接口??
  28. ????int?server_socket?=?socket(PF_INET,?SOCK_STREAM,?0);??
  29. ????if?(server_socket?<?0)??
  30. ????{??
  31. ????????printf("Create?Socket?Failed!\n");??
  32. ????????exit(1);??
  33. ????}??
  34. ??
  35. ????//?把socket和socket地址結構綁定??
  36. ????if?(bind(server_socket,?(struct?sockaddr*)&server_addr,?sizeof(server_addr)))??
  37. ????{??
  38. ????????printf("Server?Bind?Port:?%d?Failed!\n",?HELLO_WORLD_SERVER_PORT);??
  39. ????????exit(1);??
  40. ????}??
  41. ??
  42. ????//?server_socket用于監聽??
  43. ????if?(listen(server_socket,?LENGTH_OF_LISTEN_QUEUE))??
  44. ????{??
  45. ????????printf("Server?Listen?Failed!\n");??
  46. ????????exit(1);??
  47. ????}??
  48. ??
  49. ????//?服務器端一直運行用以持續為客戶端提供服務??
  50. ????while(1)??
  51. ????{??
  52. ????????//?定義客戶端的socket地址結構client_addr,當收到來自客戶端的請求后,調用accept??
  53. ????????//?接受此請求,同時將client端的地址和端口等信息寫入client_addr中??
  54. ????????struct?sockaddr_in?client_addr;??
  55. ????????socklen_t??????????length?=?sizeof(client_addr);??
  56. ??
  57. ????????//?接受一個從client端到達server端的連接請求,將客戶端的信息保存在client_addr中??
  58. ????????//?如果沒有連接請求,則一直等待直到有連接請求為止,這是accept函數的特性,可以??
  59. ????????//?用select()來實現超時檢測??
  60. ????????//?accpet返回一個新的socket,這個socket用來與此次連接到server的client進行通信??
  61. ????????//?這里的new_server_socket代表了這個通信通道??
  62. ????????int?new_server_socket?=?accept(server_socket,?(struct?sockaddr*)&client_addr,?&length);??
  63. ????????if?(new_server_socket?<?0)??
  64. ????????{??
  65. ????????????printf("Server?Accept?Failed!\n");??
  66. ????????????break;??
  67. ????????}??
  68. ??
  69. ????????char?buffer[BUFFER_SIZE];??
  70. ????????bzero(buffer,?sizeof(buffer));??
  71. ????????length?=?recv(new_server_socket,?buffer,?BUFFER_SIZE,?0);??
  72. ????????if?(length?<?0)??
  73. ????????{??
  74. ????????????printf("Server?Recieve?Data?Failed!\n");??
  75. ????????????break;??
  76. ????????}??
  77. ??
  78. ????????char?file_name[FILE_NAME_MAX_SIZE?+?1];??
  79. ????????bzero(file_name,?sizeof(file_name));??
  80. ????????strncpy(file_name,?buffer,??
  81. ????????????????strlen(buffer)?>?FILE_NAME_MAX_SIZE???FILE_NAME_MAX_SIZE?:?strlen(buffer));??
  82. ??
  83. ????????FILE?*fp?=?fopen(file_name,?"r");??
  84. ????????if?(fp?==?NULL)??
  85. ????????{??
  86. ????????????printf("File:\t%s?Not?Found!\n",?file_name);??
  87. ????????}??
  88. ????????else??
  89. ????????{??
  90. ????????????bzero(buffer,?BUFFER_SIZE);??
  91. ????????????int?file_block_length?=?0;??
  92. ????????????while(?(file_block_length?=?fread(buffer,?sizeof(char),?BUFFER_SIZE,?fp))?>?0)??
  93. ????????????{??
  94. ????????????????printf("file_block_length?=?%d\n",?file_block_length);??
  95. ??
  96. ????????????????//?發送buffer中的字符串到new_server_socket,實際上就是發送給客戶端??
  97. ????????????????if?(send(new_server_socket,?buffer,?file_block_length,?0)?<?0)??
  98. ????????????????{??
  99. ????????????????????printf("Send?File:\t%s?Failed!\n",?file_name);??
  100. ????????????????????break;??
  101. ????????????????}??
  102. ??
  103. ????????????????bzero(buffer,?sizeof(buffer));??
  104. ????????????}??
  105. ????????????fclose(fp);??
  106. ????????????printf("File:\t%s?Transfer?Finished!\n",?file_name);??
  107. ????????}??
  108. ??
  109. ????????close(new_server_socket);??
  110. ????}??
  111. ??
  112. ????close(server_socket);??
  113. ??
  114. ????return?0;??
  115. }??


?

[cpp]?view plaincopyprint?
  1. //??
  2. //?file_client.c??socket傳輸文件的client端示例程序???
  3. //?///??
  4. #include<netinet/in.h>?????????????????????????//?for?sockaddr_in??
  5. #include<sys/types.h>??????????????????????????//?for?socket??
  6. #include<sys/socket.h>?????????????????????????//?for?socket??
  7. #include<stdio.h>??????????????????????????????//?for?printf??
  8. #include<stdlib.h>?????????????????????????????//?for?exit??
  9. #include<string.h>?????????????????????????????//?for?bzero??
  10. ??
  11. #define?HELLO_WORLD_SERVER_PORT???????6666??
  12. #define?BUFFER_SIZE???????????????????1024??
  13. #define?FILE_NAME_MAX_SIZE????????????512??
  14. ??
  15. int?main(int?argc,?char?**argv)??
  16. {??
  17. ????if?(argc?!=?2)??
  18. ????{??
  19. ????????printf("Usage:?./%s?ServerIPAddress\n",?argv[0]);??
  20. ????????exit(1);??
  21. ????}??
  22. ??
  23. ????//?設置一個socket地址結構client_addr,?代表客戶機的internet地址和端口??
  24. ????struct?sockaddr_in?client_addr;??
  25. ????bzero(&client_addr,?sizeof(client_addr));??
  26. ????client_addr.sin_family?=?AF_INET;?//?internet協議族??
  27. ????client_addr.sin_addr.s_addr?=?htons(INADDR_ANY);?//?INADDR_ANY表示自動獲取本機地址??
  28. ????client_addr.sin_port?=?htons(0);?//?auto?allocated,?讓系統自動分配一個空閑端口??
  29. ??
  30. ????//?創建用于internet的流協議(TCP)類型socket,用client_socket代表客戶端socket??
  31. ????int?client_socket?=?socket(AF_INET,?SOCK_STREAM,?0);??
  32. ????if?(client_socket?<?0)??
  33. ????{??
  34. ????????printf("Create?Socket?Failed!\n");??
  35. ????????exit(1);??
  36. ????}??
  37. ??
  38. ????//?把客戶端的socket和客戶端的socket地址結構綁定???
  39. ????if?(bind(client_socket,?(struct?sockaddr*)&client_addr,?sizeof(client_addr)))??
  40. ????{??
  41. ????????printf("Client?Bind?Port?Failed!\n");??
  42. ????????exit(1);??
  43. ????}??
  44. ??
  45. ????//?設置一個socket地址結構server_addr,代表服務器的internet地址和端口??
  46. ????struct?sockaddr_in??server_addr;??
  47. ????bzero(&server_addr,?sizeof(server_addr));??
  48. ????server_addr.sin_family?=?AF_INET;??
  49. ??
  50. ????//?服務器的IP地址來自程序的參數???
  51. ????if?(inet_aton(argv[1],?&server_addr.sin_addr)?==?0)??
  52. ????{??
  53. ????????printf("Server?IP?Address?Error!\n");??
  54. ????????exit(1);??
  55. ????}??
  56. ??
  57. ????server_addr.sin_port?=?htons(HELLO_WORLD_SERVER_PORT);??
  58. ????socklen_t?server_addr_length?=?sizeof(server_addr);??
  59. ??
  60. ????//?向服務器發起連接請求,連接成功后client_socket代表客戶端和服務器端的一個socket連接??
  61. ????if?(connect(client_socket,?(struct?sockaddr*)&server_addr,?server_addr_length)?<?0)??
  62. ????{??
  63. ????????printf("Can?Not?Connect?To?%s!\n",?argv[1]);??
  64. ????????exit(1);??
  65. ????}??
  66. ??
  67. ????char?file_name[FILE_NAME_MAX_SIZE?+?1];??
  68. ????bzero(file_name,?sizeof(file_name));??
  69. ????printf("Please?Input?File?Name?On?Server.\t");??
  70. ????scanf("%s",?file_name);??
  71. ??
  72. ????char?buffer[BUFFER_SIZE];??
  73. ????bzero(buffer,?sizeof(buffer));??
  74. ????strncpy(buffer,?file_name,?strlen(file_name)?>?BUFFER_SIZE???BUFFER_SIZE?:?strlen(file_name));??
  75. ????//?向服務器發送buffer中的數據,此時buffer中存放的是客戶端需要接收的文件的名字??
  76. ????send(client_socket,?buffer,?BUFFER_SIZE,?0);??
  77. ??
  78. ????FILE?*fp?=?fopen(file_name,?"w");??
  79. ????if?(fp?==?NULL)??
  80. ????{??
  81. ????????printf("File:\t%s?Can?Not?Open?To?Write!\n",?file_name);??
  82. ????????exit(1);??
  83. ????}??
  84. ??
  85. ????//?從服務器端接收數據到buffer中???
  86. ????bzero(buffer,?sizeof(buffer));??
  87. ????int?length?=?0;??
  88. ????while(length?=?recv(client_socket,?buffer,?BUFFER_SIZE,?0))??
  89. ????{??
  90. ????????if?(length?<?0)??
  91. ????????{??
  92. ????????????printf("Recieve?Data?From?Server?%s?Failed!\n",?argv[1]);??
  93. ????????????break;??
  94. ????????}??
  95. ??
  96. ????????int?write_length?=?fwrite(buffer,?sizeof(char),?length,?fp);??
  97. ????????if?(write_length?<?length)??
  98. ????????{??
  99. ????????????printf("File:\t%s?Write?Failed!\n",?file_name);??
  100. ????????????break;??
  101. ????????}??
  102. ????????bzero(buffer,?BUFFER_SIZE);??
  103. ????}??
  104. ??
  105. ????printf("Recieve?File:\t?%s?From?Server[%s]?Finished!\n",?file_name,?argv[1]);??
  106. ??
  107. ????//?傳輸完畢,關閉socket???
  108. ????fclose(fp);??
  109. ????close(client_socket);??
  110. ????return?0;??
  111. ??
  112. }??

客戶端不一定要bind(),服務端一定要bind(),為什么?不然客戶端怎么知道服務器位置(IP+PORT)。 一般客戶端不綁定端口,因為客戶程序經常開關, 由于一些原因(這里我說不清楚,你碰到了自然理解), 斷開時端口很少立刻釋放(一般要1、2分鐘)。 所以客戶端綁定端口容易出問題。?
注:服務器綁定的是偵聽端口,客戶連接后,? 新分配一個sock和它連接(這個sock的port是不同的,相當于沒有bind的一個端口)? 由于偵聽端口是沒有實際聯接的,所以斷開時不需握手,也就沒有釋放問題了。???(注這段是回答時突然想到的,自我感覺是正確的,大家來批判啊)


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384311.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384311.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

操作系統(二)進程管理

ui 操作系統&#xff08;二&#xff09;進程管理一、進程程序和進程進程控制塊&#xff08;PCB&#xff09;進程的組成進程的特征進程的狀態與轉換進程狀態的轉換進程的組織鏈接方式索引方式進程的控制進程的創建進程的終止進程阻塞進程喚醒進程切換進程通信共享存儲消息傳遞管…

gethostbyname()函數說明

轉載&#xff1a;http://www.cnblogs.com/cxz2009/archive/2010/11/19/1881611.html gethostbyname()函數說明——用域名或主機名獲取IP地址 包含頭文件 #include <netdb.h> #include <sys/socket.h> 函數原型 struct hostent *gethostbyna…

操作系統(三)內存管理

操作系統&#xff08;三&#xff09;內存管理一、程序執行過程裝入的三種方式鏈接的三種方式二、內存管理的概念內存空間的分配與回收連續分配管理方式單一連續分配固定分區分配動態分區分配首次適應算法最佳適應算法最壞適應算法鄰近適應算法非連續分配管理方式基本分頁存儲管…

操作系統(四)文件管理

操作系統&#xff08;四&#xff09;文件管理一、文件系統基礎1.文件邏輯結構無結構文件有結構文件2.文件目錄文件控制塊&#xff08;FCB&#xff09;目錄結構單級目錄兩級目錄結構多級目錄結構無環圖目錄結構3.文件保護口令保護加密保護訪問控制4.文件共享硬鏈接軟鏈接5.文件系…

struct stat結構體簡介

轉載&#xff1a;http://www.cnblogs.com/CSU-PL/archive/2013/06/06/3120757.html 在使用這個結構體和方法時&#xff0c;需要引入&#xff1a; <sys/types.h> <sys/stat.h> struct stat這個結構體是用來描述一個linux系統文件系統中的文件屬性的結構。 可以有兩種…

如何在Ubuntu上安裝GCC編譯器

如何在Ubuntu上安裝GCC編譯器1.首先更新包列表sudo apt update2.安裝build-essential軟件包&#xff1a; sudo apt install build-essential3.驗證GCC編譯器是否已成功安裝&#xff0c;請使用gcc --version命令打印GCC版本 rootubuntu:/home/csd# gcc --version

操作系統(五)輸入/輸出(I/O)管理

操作系統&#xff08;五&#xff09;輸入/輸出&#xff08;I/O&#xff09;管理一、I/O控制器二、I/O控制方式程序直接控制方式中斷驅動方式DMA方式通道控制方式I/O軟件層次結構假脫機技術設備的分配與回收緩沖區單緩沖雙緩沖循環緩沖區緩沖池一、I/O控制器 I/O設備由機械部件…

Linux下的I/O多路復用select,poll,epoll淺析

轉載&#xff1a;http://blog.csdn.net/u011573853/article/details/52105365 一&#xff0c;什么是I/O多路復用 所謂的I/O多路復用在英文中其實叫 I/O multiplexing. 就是單個線程&#xff0c;通過記錄跟蹤每個I/O流(sock)的狀態&#xff0c;來同時管理多個I/O流 。) I/O mu…

計算機組成原理(一)計算機系統概述

計算機組成原理&#xff08;一&#xff09;計算機系統概述一、計算機系統層次結構馮諾伊曼機計算機工作過程多級層次結構一、計算機系統層次結構 馮諾伊曼機 特點&#xff1a; 計算機由五大部件組成指令和數據以同等地位存于存儲 器&#xff0c;可按地址尋訪指令和數據用二進…

計算機組成原理(二)數據的表示和運算

計算機組成原理&#xff08;二&#xff09;數據的表示和運算一、BCD碼二、奇偶校驗碼三、海明碼四、循環冗余校驗碼&#xff08;CRC&#xff09;五、乘法運算原碼乘法補碼乘法六、除法運算原碼除法補碼除法七、浮點數的表示與運算浮點數的運算一、BCD碼 組合式BCD碼&#xff1…

select read write

轉載&#xff1a;http://blog.csdn.net/beginning1126/article/details/8057498 [cpp] view plaincopy <p style"color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; "><span style"font-size:14px;…

數據結構(七)圖的遍歷(遞歸非遞歸方法)

圖的遍歷&#xff08;遞歸非遞歸方法&#xff09;#include<iostream> #include<stdio.h> #include<stack> #include<queue> using namespace std;typedef char VertexType; typedef int EdgeType;#define MAXVEX 100 #define INF 65535 bool visited[M…

Linux IO復用區別與epoll詳解

轉載&#xff1a;http://blog.csdn.net/hacker00011000/article/details/52160590 一、select、poll、epoll之間的區別總結[整理]   select&#xff0c;poll&#xff0c;epoll都是IO多路復用的機制。I/O多路復用就通過一種機制&#xff0c;可以監視多個描述符&#xff0c;一…

簡單圖和多重圖

一、簡單圖 ?? ① 不存在重復邊&#xff1b; ?? ② 不存在頂點到自身的邊&#xff1b; 二、多重圖 ??① 某兩結點之間邊數多于一條&#xff1b; ??② 允許頂點通過一條邊和自己關聯&#xff1b;

C++筆記:select多路復用機制

轉載&#xff1a;http://blog.csdn.net/qdx411324962/article/details/42499535 函數作用&#xff1a; 系統提供select函數來實現多路復用輸入/輸出模型。select系統調用是用來讓我們的程序監視多個文件句柄的狀態變化的。程序會停在select這里等待&#xff0c;直到被監視的文件…

交叉編譯執行應用程序出現:No such file or directory

問題分析 當我在arm板子上執行交叉編譯過的程序的時候發現了這個錯誤。通過百度查詢基本都是缺少32位庫什么的,但是都不能解決問題。 然后我用ll指令&#xff0c;也排除了權限的原因。 我們用ldd指令發現&#xff0c;它不是動態執行的&#xff0c;雖然我們可以使用-static指…

select、poll、epoll 比較

轉載&#xff1a;http://blog.csdn.net/dodo_328/article/details/39081183 1.Selet&#xff1a;本質上是通過設置或者檢查存放fd標志位的數據結構來進行下一步處理。 缺點&#xff1a;1 單個進程可監視的fd數量被限制&#xff0c;因為受描述符集合fd_set限制&#xff0c;fd數量…

C庫函數 File

C庫函數常用的有&#xff1a;fopen, fclose, fread, fwrite, fgets, fputs, fscanf, fprintf, fseek, fgetc, fputc, ftell, feof, flush等&#xff0c; 當使用fopen打開一個文件時通常返回一個文件指針 FILE *fp。FILE類型是一個結構體&#xff0c;包含文件描述符&#xff08;…

Unix 網絡編程(四)- 典型TCP客服服務器程序開發實例及基本套接字API介紹

轉載&#xff1a;http://blog.csdn.net/michael_kong_nju/article/details/43457393 寫在開頭&#xff1a; 在上一節中我們學習了一些基礎的用來支持網絡編程的API&#xff0c;包括“套接字的地址結構”、“字節排序函數”等。這些API幾乎是所有的網絡編程中都會使用的一些&…

C庫函數與系統函數的關系

轉載于:https://www.cnblogs.com/lr1402585172/p/10464933.html