1. 程式人生 > >linux下c/c++例項之十socket簡單應用

linux下c/c++例項之十socket簡單應用

一、簡介

      通過socket掃描本機開啟的tcp埠號,模擬使用者名稱、密碼登入伺服器的過程、socket檔案傳輸及模仿http伺服器。

二、詳解

1、Linux下tcp埠掃描

(1)scanport.c:

  1. // 埠掃描程式,只支援掃描TCP埠  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #include <
    pthread.h>
  8. #include <sys/types.h>
  9. #include <sys/socket.h>
  10. #include <netinet/in.h>
  11. #include <arpa/inet.h>
  12. // 定義一個埠區間資訊  
  13. typedef struct _port_segment {  
  14.     struct in_addr       dest_ip;   // 目標IP  
  15.     unsigned short int  min_port;   // 起始埠  
  16.     unsigned short int  max_port;   // 最大埠  
  17. } port_segment;  
  18. /*自定義的錯誤處理函式*/  
  19. void my_err(const char * err_string, int line)  
  20. {  
  21.     fprintf(stderr, "line:%d  ", line);  
  22.     perror(err_string);  
  23.     exit(1);  
  24. }  
  25. /*  
  26.  * 描  述:掃描某一IP地址上的某一個埠的函式  
  27.  * 返回值:-1  出錯  
  28.  *     0   目標埠未開啟  
  29.  *     1   目標埠已開啟  
  30.  */  
  31. int do_scan(struct sockaddr_in serv_addr)  
  32. {  
  33.     int     conn_fd;  
  34.     int     ret;  
  35.     // 建立一個TCP套接字  
  36.     conn_fd = socket(AF_INET, SOCK_STREAM,0);  
  37.     if (conn_fd <0) {  
  38.         my_err("socket", __LINE__);  
  39.     }  
  40.     // 向伺服器端傳送連線請求  
  41.     if ((ret = connect(conn_fd, (struct sockaddr *)&serv_addr, sizeof (struct sockaddr))) <0 ) {  
  42.         if (errno == ECONNREFUSED) {    // 目標埠未開啟  
  43.             close(conn_fd);  
  44.             return 0;  
  45.         } else {    // 其他錯誤  
  46.             close(conn_fd);  
  47.             return -1;  
  48.         }  
  49.     } else if (ret == 0){  
  50.         printf("port %d found in %s\n", ntohs(serv_addr.sin_port),  
  51.                inet_ntoa(serv_addr.sin_addr));  
  52.         close(conn_fd);  
  53.         return 1;  
  54.     }  
  55.     return -1;  // 實際執行不到這裡,只是為了消除編譯程式時產生的警告  
  56. }  
  57. // 執行掃描的執行緒,掃描某一區間的埠  
  58. void * scaner(void *arg)  
  59. {  
  60.     unsigned short int  i;  
  61.     struct sockaddr_in  serv_addr;  
  62.     port_segment        portinfo;     // 埠資訊  
  63.     // 讀取埠區間資訊  
  64.     memcpy(&portinfo, arg, sizeof(struct _port_segment));  
  65.     // 初始化伺服器端地址結構  
  66.     memset(&serv_addr, 0, sizeof (struct sockaddr_in));  
  67.     serv_addr.sin_family = AF_INET;  
  68.     serv_addr.sin_addr.s_addr = portinfo.dest_ip.s_addr;  
  69.     //printf("******serv_addr.sin_addr.s_addr=%s\n", serv_addr.sin_addr.s_addr);  
  70.     //printf("*******portinfo.min_port=%d, portinfo.max_port=%d\n", portinfo.min_port, portinfo.max_port);  
  71.     for (i=portinfo.min_port; i<=portinfo.max_port; i++) {  
  72.         serv_addr.sin_port = htons(i);  
  73.         if (do_scan(serv_addr) <0) {  
  74.             continue;   // 出錯則退出程序  
  75.         }  
  76.     }  
  77.     return NULL;  
  78. }  
  79. /*  
  80.  * 命令列引數:-m 最大埠, -a 目標主機的IP地址,  -n 最大執行緒數  
  81.  */  
  82. int main(int argc, char **argv)  
  83. {  
  84.     pthread_t*  thread;         // 指向所有的執行緒ID  
  85.     int     max_port;       // 最大埠號  
  86.     int     thread_num;     // 最大執行緒數  
  87.     int     seg_len;        // 埠區間長度  
  88.     struct in_addr dest_ip;         // 目標主機IP  
  89.     int     i;  
  90.     // 檢查引數個數  
  91.     if (argc != 7) {  
  92.         printf("Usage: [-m] [max_port] [-a] [serv_address] [-n] [thread_number]\n");  
  93.         exit(1);  
  94.     }  
  95.     // 解析命令列引數  
  96.     for (i=1; i<argc; i++) {  
  97.         if (strcmp("-m", argv[i]) == 0) {  
  98.             max_port = atoi(argv[i+1]);   // 將字串轉化為對應的整數  
  99.             if (max_port <0 || max_port >= 65535) {   //65535會導致死迴圈  
  100.                 printf("Usage:invalid max dest port\n");  
  101.                 exit(1);  
  102.             }  
  103.             continue;  
  104.         }  
  105.         if (strcmp("-a", argv[i]) == 0) {  
  106.             if (inet_aton(argv[i+1], &dest_ip) == 0) {  
  107.                 printf("Usage:invalid dest ip address\n");  
  108.                 exit(1);  
  109.             }  
  110.             continue;  
  111.         }  
  112.         if (strcmp("-n", argv[i]) == 0) {  
  113.             thread_num = atoi(argv[i+1]);  
  114.             if (thread_num <= 0) {  
  115.                 printf("Usage:invalid thread_number\n");  
  116.                 exit(1);  
  117.             }  
  118.             continue;  
  119.         }  
  120.     }  
  121.     // 如果輸入的最大埠號小於執行緒數,則將執行緒數設為最大埠號  
  122.     if (max_port <thread_num) {  
  123.         thread_num = max_port;  
  124.     }  
  125.     seg_len = max_port / thread_num;  
  126.     if ( (max_port%thread_num) != 0 ) {  
  127.         thread_num += 1;  
  128. 相關推薦

    linuxc/c++例項socket簡單應用

    一、簡介       通過socket掃描本機開啟的tcp埠號,模擬使用者名稱、密碼登入伺服器的過程、socket檔案傳輸及模仿http伺服器。 二、詳解 1、Linux下tcp埠掃描 (1)scanport.c: /

    linuxc/c++例項socket伺服器例項

    一、簡介 二、詳解 (1)多執行緒併發伺服器server.c //使用pthread執行緒庫 #include <stdio.h> #include <string.h> #include <u

    linux rpc python 例項使用XML-RPC進行遠端檔案共享

    這是個不錯的練習,使用python開發P2P程式,或許通過這個我們可以自己搞出來一個P2P下載工具,類似於迅雷。說到迅雷,關於其原理不知道大家是否瞭解,如果你不瞭解,我想看完這篇文章,你一定會了解的。啥,你已經瞭解了?那就過來指點一番。 以前在java中也接觸過類似的概念。一個是RMI( Remote Me

    linuxc/c++例項c實現的bt軟體下載(記錄)

    一、簡介        可能許多人使用過位元彗星(BitComet)、位元精靈(BitSpirit)、迅雷下載過自己喜歡的影片、電視劇、網路遊戲;還有很多人使用過PPLive、PPStream、沸點、QQ直播等免費的網路電視直播軟體線上觀看自己喜歡的影片。所有這些軟體都採

    Linux C編程九(1) libevent基本概念

    通信 == socket通信 驅動 1.4 event http linu make 一、libevent是幹什麽的 1. 開源的庫, 提高開發效率 封裝了socket通信 封裝了IO多路轉接 2. 精簡, 專註於網絡, 性能高 3

    LinuxC獲取當前時間

    time() 使用 ble timespec -1 ber 區間 本地 指向 Linux下用C獲取當前時間,具體如下: 代碼(可以把clock_gettime換成time(NULL)) ? 1 2 3 4 5 6 7 8 9 10 void getN

    C#設計模式二代理模式(Proxy Pattern)【結構型】

    ride col 安全 .html 使用權 防火墻 一對多 tro 橋接 原文:C#設計模式之十二代理模式(Proxy Pattern)【結構型】一、引言 今天我們要講【結構型】設計模式的第七個模式,也是“結構型”設計模式中的最後一個模式,該模式是【代理模式】,英文名稱

    C#設計模式七中介者模式(Mediator Pattern)【行為型】

    [] 過多 深入 理解 申請 代碼實現 控制 name 缺點 原文:C#設計模式之十七中介者模式(Mediator Pattern)【行為型】一、引言 今天我們開始講“行為型”設計模式的第五個模式,該模式是【中介者模式】,英文名稱是:Mediator Pattern。還

    C#設計模式六觀察者模式(Observer Pattern)【行為型】

    ngx 現實生活 松耦合 mon html 機制 account current 很好 原文:C#設計模式之十六觀察者模式(Observer Pattern)【行為型】一、引言 今天是2017年11月份的最後一天,也就是2017年11月30日,利用今天再寫一個模式,爭取

    C#設計模式一享元模式(Flyweight Pattern)【結構型】

    eal 客戶 來看 滿足 對象狀態 英文 輔助 3.3 fig 原文:C#設計模式之十一享元模式(Flyweight Pattern)【結構型】一、引言 今天我們要講【結構型】設計模式的第六個模式,該模式是【享元模式】,英文名稱是:Flyweight Pattern。還

    C#設計模式九策略模式(Stragety Pattern)【行為型】

    多條件 第一次 必須 this 數據傳遞 名稱 面向 div 想要 原文:C#設計模式之十九策略模式(Stragety Pattern)【行為型】一、引言 今天我們開始講“行為型”設計模式的第七個模式,該模式是【策略模式】,英文名稱是:Stragety Pattern。

    LinuxC語言開發

    xuni autoconf htm 參加 eve http 學習資料 inux c語言開發 工具 學會使用vim/emacs,vim/emacs是linux下最常用的源碼編輯具,不光要學會用它們編輯源碼,還要學會用它們進行查找、定位、替換等。 學會makefile文件的編

    linux利用CC++ 語言調用需要root權限的函數

    編譯程序 註意 步驟 oot 登錄 調用 get bsp 屬於 1、setuid法(1)登錄root用戶,將程序設置成root:root所有者(等價於:登錄root用戶編譯程序)。也可直接將普通用戶加入root組中,那麽編譯程序不用來回切換用戶。(2)登錄root用戶設置程

    linux編譯c語言教程

    準備工作 - Linux系統 - 懂得Linux系統下編輯器vim/vi軟體的使用 - 懂得簡易的c語言程式設計(初次學習的同學可以直接複製文章末尾的原始碼) 總結一下:有Linux系統,會使用Linux系統下的文字編輯器,有一點c語言基礎即可。 建立c語言檔案並編譯

    linux 執行C程式

    #include<stdio.h> int main(){ int a=100,b=25; if(a>b) printf(" The high value is %d\n",a); else printf(" Th

    LinuxC語言函式perror

    perror的函式原型為`void perror(const char *s)` 這個函式會先輸出你傳給他的實參 s 所指的字串,後面再加上錯誤原因字串。此錯誤原因依照全域性變數errno 的值來決定要輸出的字串。 在庫函式中有個errno變數,每個errno值對應著以字串表示的錯誤型別。當

    單目跟蹤位姿產品研發(二)----在linuxc++工程打包成動態庫so檔案API

           單目跟蹤位姿專案由對方公司提供應用場景,我方研發核心演算法,通過c++實現功能,然後對方公司通過java\js來開發炫酷的介面,共同合作完成,最終對方公司負責銷售推廣,推向市場。因此,涉及到java介面呼叫c++核心程式碼的問題。 現記錄

    LINUX編譯c++11的程式碼

     C++11,(即ISO/IEC 14882:2011),是目前的C++程式語言的最新正式標準。它取代了第二版標準(第一版公開於1998年,第二版於2003年更新,分別通稱C++98以及C++03,兩者差異很小)。新的標準包含核心語言的新機能,而且擴充套件C++標準程式庫。C++11新標準

    linuxc語言系統函式呼叫

    目錄 4.linux下的系統函式的使用 c語言 4.1數學函式的使用 1pow函式 2.exp函式 3.log函式 4.rand()隨機數函式 4.2字元函式的使用 4.3系統時間與日期函式的使用 系統時間 時間間隔 4.4環境控制函式 &nb

    Linux執行c++程式

    1.建立hello.cpp檔案 vi hello.cpp 2.程式程式碼 #include<iostream> using namespace std; int main() { cout << "Hello World!" << endl;