linux下c/c++例項之十socket簡單應用
一、簡介
通過socket掃描本機開啟的tcp埠號,模擬使用者名稱、密碼登入伺服器的過程、socket檔案傳輸及模仿http伺服器。
二、詳解
1、Linux下tcp埠掃描
(1)scanport.c:
- // 埠掃描程式,只支援掃描TCP埠
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <errno.h>
-
#include <
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- // 定義一個埠區間資訊
- typedef struct _port_segment {
- struct in_addr dest_ip; // 目標IP
- unsigned short int min_port; // 起始埠
-
unsigned short int max_port; // 最大埠
- } port_segment;
- /*自定義的錯誤處理函式*/
- void my_err(const char * err_string, int line)
- {
- fprintf(stderr, "line:%d ", line);
- perror(err_string);
- exit(1);
- }
- /*
- * 描 述:掃描某一IP地址上的某一個埠的函式
- * 返回值:-1 出錯
- * 0 目標埠未開啟
- * 1 目標埠已開啟
- */
-
int do_scan(struct sockaddr_in serv_addr)
- {
- int conn_fd;
- int ret;
- // 建立一個TCP套接字
- conn_fd = socket(AF_INET, SOCK_STREAM,0);
- if (conn_fd <0) {
- my_err("socket", __LINE__);
- }
- // 向伺服器端傳送連線請求
- if ((ret = connect(conn_fd, (struct sockaddr *)&serv_addr, sizeof (struct sockaddr))) <0 ) {
- if (errno == ECONNREFUSED) { // 目標埠未開啟
- close(conn_fd);
- return 0;
- } else { // 其他錯誤
- close(conn_fd);
- return -1;
- }
- } else if (ret == 0){
- printf("port %d found in %s\n", ntohs(serv_addr.sin_port),
- inet_ntoa(serv_addr.sin_addr));
- close(conn_fd);
- return 1;
- }
- return -1; // 實際執行不到這裡,只是為了消除編譯程式時產生的警告
- }
- // 執行掃描的執行緒,掃描某一區間的埠
- void * scaner(void *arg)
- {
- unsigned short int i;
- struct sockaddr_in serv_addr;
- port_segment portinfo; // 埠資訊
- // 讀取埠區間資訊
- memcpy(&portinfo, arg, sizeof(struct _port_segment));
- // 初始化伺服器端地址結構
- memset(&serv_addr, 0, sizeof (struct sockaddr_in));
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_addr.s_addr = portinfo.dest_ip.s_addr;
- //printf("******serv_addr.sin_addr.s_addr=%s\n", serv_addr.sin_addr.s_addr);
- //printf("*******portinfo.min_port=%d, portinfo.max_port=%d\n", portinfo.min_port, portinfo.max_port);
- for (i=portinfo.min_port; i<=portinfo.max_port; i++) {
- serv_addr.sin_port = htons(i);
- if (do_scan(serv_addr) <0) {
- continue; // 出錯則退出程序
- }
- }
- return NULL;
- }
- /*
- * 命令列引數:-m 最大埠, -a 目標主機的IP地址, -n 最大執行緒數
- */
- int main(int argc, char **argv)
- {
- pthread_t* thread; // 指向所有的執行緒ID
- int max_port; // 最大埠號
- int thread_num; // 最大執行緒數
- int seg_len; // 埠區間長度
- struct in_addr dest_ip; // 目標主機IP
- int i;
- // 檢查引數個數
- if (argc != 7) {
- printf("Usage: [-m] [max_port] [-a] [serv_address] [-n] [thread_number]\n");
- exit(1);
- }
- // 解析命令列引數
- for (i=1; i<argc; i++) {
- if (strcmp("-m", argv[i]) == 0) {
- max_port = atoi(argv[i+1]); // 將字串轉化為對應的整數
- if (max_port <0 || max_port >= 65535) { //65535會導致死迴圈
- printf("Usage:invalid max dest port\n");
- exit(1);
- }
- continue;
- }
- if (strcmp("-a", argv[i]) == 0) {
- if (inet_aton(argv[i+1], &dest_ip) == 0) {
- printf("Usage:invalid dest ip address\n");
- exit(1);
- }
- continue;
- }
- if (strcmp("-n", argv[i]) == 0) {
- thread_num = atoi(argv[i+1]);
- if (thread_num <= 0) {
- printf("Usage:invalid thread_number\n");
- exit(1);
- }
- continue;
- }
- }
- // 如果輸入的最大埠號小於執行緒數,則將執行緒數設為最大埠號
- if (max_port <thread_num) {
- thread_num = max_port;
- }
- seg_len = max_port / thread_num;
- if ( (max_port%thread_num) != 0 ) {
- thread_num += 1;
-
相關推薦
linux下c/c++例項之十socket簡單應用
一、簡介 通過socket掃描本機開啟的tcp埠號,模擬使用者名稱、密碼登入伺服器的過程、socket檔案傳輸及模仿http伺服器。 二、詳解 1、Linux下tcp埠掃描 (1)scanport.c: /
linux下c/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
linux下c/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
Linux下用C獲取當前時間
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。
Linux下的C語言開發
xuni autoconf htm 參加 eve http 學習資料 inux c語言開發 工具 學會使用vim/emacs,vim/emacs是linux下最常用的源碼編輯具,不光要學會用它們編輯源碼,還要學會用它們進行查找、定位、替換等。 學會makefile文件的編
linux下利用C或C++ 語言調用需要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
Linux下的C語言函式perror
perror的函式原型為`void perror(const char *s)` 這個函式會先輸出你傳給他的實參 s 所指的字串,後面再加上錯誤原因字串。此錯誤原因依照全域性變數errno 的值來決定要輸出的字串。 在庫函式中有個errno變數,每個errno值對應著以字串表示的錯誤型別。當
單目跟蹤位姿產品研發(二)----在linux下將c++工程打包成動態庫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新標準
linux下的c語言系統函式呼叫
目錄 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;