1. 程式人生 > >上機考試作弊,也不是不可以呢

上機考試作弊,也不是不可以呢

前言

  這學期的C++課學校用了北理工的一套軟體,大概一兩週就有一次上機考試,軟體的防作弊機制就是每個學號繫結一個IP地址,單學號登入多IP、單IP被多個學號登入都會觸發重修小彩蛋。不過,正所謂時勢造英雄,當人人都在抱怨的時候為什麼不想一個脫離防作弊機制的手段呢?

  本文將介紹我前段時間寫的一個程式,基於TCP的Winsock程式設計實現檔案的傳送。考試時大家埋頭思索,這時候把答案通過IP地址傳送給喜歡的妹子,脫單似乎就近在咫尺了啊。

思路

  Winsock的學習看微軟官網手冊就夠了,一步一步跟著敲下來,基本上就算是入門了。

  下面簡單講一下Winsock程式設計的基本思路:

  Server端:建立巢狀字並初始化,建立socket,初始化socket(將埠號及IP地址繫結),listen監聽,accept不斷接受連線,接受到連線後,捕獲socket,recv獲得內容,通訊完成後關閉socket。

  Client端:建立巢狀字並初始化,建立socket,繫結埠號及目標IP地址,connect連線伺服器,send傳送訊息,通訊結束後關閉socket。

完整程式碼

使用軟體:codeblocks

使用者端:TransferFile-Client.cpp

// TransferFile-Client.cpp:Define the entry point for the console application.
// Program Function : Transfer file by C/S : Part Client
// Author : zhaoyixiang
// E-mail : [email protected]
// Date : 2018-5-1 #define _WIN32_WINNT 0x501 #include <winsock2.h> #include <ws2tcpip.h> #include <iphlpapi.h> #include <stdio.h> #include <cstring> #pragma comment(lib, "Ws2_32.lib") #define DEFAULT_PORT "27015" #define DEFAULT_BUFLEN 512 using namespace std; int main(int argc, char const *argv[]) { WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { printf("WSAStartup failed: %d\n", iResult); return 1; } /* Creating a Socket for the Client Declare an addrinfo object that contains a sockaddr structure and initialize these values. For this application, the Internet address family is unspecified so that either an IPv6 or IPv4 address can be returned. The application requests the socket type to be a stream socket for the TCP protocol. */ struct addrinfo *result = NULL, *ptr = NULL, hints; ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; // Resolve the server address and port iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); if (iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); return 1; } char temp[DEFAULT_BUFLEN]; strcpy(temp, "main.cpp"); // create file FILE * fp = fopen(temp, "rb"); // binary mode for read if(fp == NULL) { printf("open file %s failed\n", temp); return -1; } SOCKET ConnectSocket = INVALID_SOCKET; ptr = result; ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (ConnectSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; } /* Connecting to a Socket For a client to communicate on a network, it must connect to a server. */ iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); if (iResult == SOCKET_ERROR) { printf("Unable to connect to server!\n"); WSACleanup(); return 1; } /* Sending and Receiving Data on the Client */ int recvbuflen = DEFAULT_BUFLEN; char recvbuf[DEFAULT_BUFLEN]; char sendbuf[DEFAULT_BUFLEN]; int num = 0; while(!feof(fp)) { num = fread(temp, 1, DEFAULT_BUFLEN, fp); send(ConnectSocket, temp, num, 0); } printf("server file transfer success\n"); fclose(fp); iResult = shutdown(ConnectSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("Shutdown failed: %d\n", WSAGetLastError()); closesocket(ConnectSocket); WSACleanup(); return 1; } closesocket(ConnectSocket); WSACleanup(); return 0; }

服務端:TransferFile-Server.cpp

// TranferFile-Server.cpp:Define the entry point for the console application.
// Program Function : Transfer file by C/S : Part Server
// Author : zhaoyixiang
// E-mail : [email protected]
// Date : 2018-5-1

#define _WIN32_WINNT  0x501
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <cstring>

#pragma comment(lib, "Ws2_32.lib")

#define DEFAULT_PORT "27015"
#define DEFAULT_BUFLEN 512

using namespace std;

int main(int argc, char const *argv[])
{
    WSADATA wsaData;

    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0)
    {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }


    char file_name[DEFAULT_BUFLEN];
    char temp[DEFAULT_BUFLEN];
    strcpy(file_name, "receive test");
    //create file
    FILE *fp = fopen(file_name, "wb");
    if(fp == NULL)
    {
        printf("create file %s failed\n", file_name);
        return -1;
    }


    /*
        Creating a Socket for the Server
    */
    struct addrinfo *result = NULL, hints;

    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;

    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (iResult != 0)
    {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    SOCKET ListenSocket = INVALID_SOCKET;
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    if (ListenSocket == INVALID_SOCKET)
    {
        printf("Error at sock(): %ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }


    /*
        Binding a Socket
        For a server to accept client connections,
        it must be bound to a network address within the system.
    */
    iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
    if (iResult == SOCKET_ERROR)
    {
        printf("bind failed: %d\n", WSAGetLastError());
        freeaddrinfo(result);
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    freeaddrinfo(result);



    /*
        Listening on a Socket
        After the socket is bound to an IP address and port on the system,
        the server must then listen on that IP address and port
        for incoming connection requests.
    */
    if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR)
    {
        printf("Listen failed with error: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }


    /*
        Accepting a Connection
        Once the socket is listening for a connection,
        the program must handle connection requests on that socket.
    */
    SOCKET ClientSocket;
    ClientSocket = INVALID_SOCKET;
    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET)
    {
        printf("accept failed: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }


    /*
        Receiving and Sending Data on the Server
    */
    char recvbuf[DEFAULT_BUFLEN];
    int iSendResult;
    int recvbuflen = DEFAULT_BUFLEN;


    //receive data from server
    int num = 0;
    while (1)
    {
        num = recv(ClientSocket, temp, DEFAULT_BUFLEN, 0);
        if(0 == num)
            break;
        fwrite(temp, 1, num, fp);
    }
    printf("transmission done\n");

    fclose(fp);


    // shutdown the connection for sending since no more data will be sent
    // the client can still use the ConnectSocket for receiving data
    iResult = shutdown(ClientSocket, SD_SEND);
    if (iResult == SOCKET_ERROR)
    {
        printf("shutdown failed: %d\n", WSAGetLastError());
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }

    // cleanup
    closesocket(ClientSocket);



    WSACleanup();

    return 0;
}




注意事項

  codeblocks呼叫API還是比較麻煩的

  #include <winsock2.h>

  #pragma comment(lib, "Ws2_32.lib")

  以上是常規操作,而cb想編譯成功的話則需進行一下操作:

  選擇project -> Build options

  

  Linker settings -> other linker options -> 輸入-lws2_32 -> OK


使用方法

  先執行server檔案,再用命令列執行client檔案並輸入接受方的IP地址,事先準備好的main.cpp(可以更換名稱)即可傳送。

  Teamwork時,自己持有Client檔案,給妹子Server檔案,然後趁著月黑風高為所欲為。

補充

  當然了,真正操作的時候不要傻乎乎的將生成的TransferFile-Client.exe / TransferFile-Server.exe檔案直接擺在桌面上,監考老師只要學過英語就能發現你在作弊好吧!!!

  到網上搜一個教程把檔案圖示改了,再把檔名改成常用軟體名,例如notepad++,這樣老師一般不會注意到。

總結

  據說點讚的人一週之內都會脫單。。。(逃

相關推薦

上機考試作弊可以

前言  這學期的C++課學校用了北理工的一套軟體,大概一兩週就有一次上機考試,軟體的防作弊機制就是每個學號繫結一個IP地址,單學號登入多IP、單IP被多個學號登入都會觸發重修小彩蛋。不過,正所謂時勢造英雄,當人人都在抱怨的時候為什麼不想一個脫離防作弊機制的手段呢?  本文將介

電腦卡在LOGO界面進步了系統了bios解決辦法

卡住 後來 開機 方案 方法 使用 原來 重裝 windows 海爾雲悅mini2開機一直卡在品牌LOGO界面,進不了系統,也進不了bios 家裏有臺閑置的海爾微型主機:雲悅mini2 系統有點卡,就格式化重裝一下。然後裝完windows7後,重啟機器,發現機器不能無法進系

程序員 | 沒有該加的班沒有該加的班

blog 出了 等你 年輕 共享經濟 互聯網公司 技術分享 ESS jpg 我身邊有兩個在不同網絡公司上班的朋友,一個是從不加班的CC,一個是加班加到淩晨的小R,就因為工作時間的問題,我們三個人的友情通常靠微信聯系,用CC的話說就是:我跟你們有時差,用小R的話說就是:你們知

利用Python來探班女神的QQ空間!就算她遮蔽了阻止了我!

誰還沒暗戀過哪個妹子啊!當然那些暗戀的妹子應該稱做為女生,今天就教大家一個簡單的算是爬蟲的案例吧! 主要實現的功能就是:探班女神的 QQ空間,一旦女神釋出新的說說,你的郵箱馬上就會收到說說內容,是不是想了解一下 先看看程式碼執行效果圖: 更多Python視訊、原始碼、資料加

現代社會再複雜脫古老定律---《輕鬆享有成功和富裕》作者自序3

明確方向十分必要  但這不僅是一個簡單的故事。故事中講述的更多的是《財務自由之路》一書中所敘述的獲取成功與富裕的規律。 這些規律不受時間或地點的限制,是你在任何情況下要贏得成功的準則。  沒有地點的限制,其含義是,它在所有地方都有效,在每個社會、每種文化以及任何情況下

volatile能保證原子性能保證執行緒安全

volatile只能保證變數的可見性,無法保證對變數的操作的原子性。 還是以最常用的i++來說吧,包含3個步驟 1,從記憶體讀取i當前的值 2,加1 3,把修改後的值重新整理到記憶體 對於普通變數來說多執行緒下1,2之間被中斷,其

安裝win7提示“我們無法建立新的分割槽到現有分割槽”

昨天給xp電腦安裝win7系統。剛開始是用的Ghost版本的win7,在xp下直接執行GHOST工具,一鍵還原到C盤。誰想到重啟電腦GHOST完成重啟安裝,安裝到50%停止不動了。無奈就使用老毛桃U盤

作弊還有這操作[允悲][允悲]

href controls temp eight 操作 template pla control idt 這作弊,還有這操作呢[允悲][允悲] 這作弊,還有這操作呢[允悲][允悲] 這作弊,還有這操作呢[允悲][允悲]

科目三考試通過 來說說一些體會

前天上午,終於考過了科目三。現在的心情,還是很開心。像是做夢一樣。 科目三考了三次。對我來說,就像是橫亙在面前的一座山難以逾越,但是終於考過了。第一次考,信心滿滿。因為科目二是一次性通過,再加上教練說科目三非常容易考,考前的感覺就是信手拈來。但是考場上第一次起步的時候

分散式資料庫當然有主鍵的需求但是為什麼直接使用uuid作為主鍵

1. UUID生成速率低下 Java的UUID依賴於SecureRandom.nextBytes方法,而SecureRandom又依賴於作業系統提供的隨機數源,在Linux系統下,它的預設依賴是/dev/random,而這個源是阻塞的。最可怕的是,這個nextBytes方法

小林求職記(二):說好的問基礎為啥我感覺一點基礎

在上一輪的面試中,小林在mysql方面因為作答不夠完善,被面試官吊打了一番。經過兩天的自我複習之後,新的一輪面試又開始了。 面試官:你好,請簡單介紹下自己吧。 小林:你好,我是xxxxxx,之前在深圳的xxx公司負責了xxx系統的研發設計。 面試官:嗯嗯,那我先來問你一些基礎問題吧。 小林:嗯嗯,好的。 面試

'mingw32-make' 是內部或外部命令是可運行的程序 或批處理文件。(的解決方案)

windows 外部命令 搜索 方案 win mage -m 分享 image 問題如上。 解決方案:找到mingw32-make,方法是在計算中搜索 然後將其復制到C:Windows\System32下,需要管理員權限才能復制的情況下直接點繼續。然後就可以了。 

IPHONE6 近來1年會開放NFC的API給開發人員就是僅僅能用來做支持了如今

company its put ech tran repo article -s cati IPHONE6 近來1還不會開放NFC的API給開發人員,也就是僅僅能用來做支持了如今,可是能夠肯定的是,以後肯定會放發出來的。就像指紋傳感器一樣,如今也開放出來了。前

聊聊成為大神路上的過程(決定偉大水平和一般水平的關鍵因素是天賦是經驗而是[刻意練習]的程度要多看別人的代碼)

www 思維 原因 時間管理 匯報 何事 why 連續 準則 每個人都在成為大神的路上,只不過有的人在走,而有的人在跑。 寫在前面的話 在開始正文之前我先跟大家分享一個我身邊的例子。我有兩個朋友,A和B。B從高一開始打dota,A從高二開始,到高中畢業的時候,A已經是一

最好的方式是用VirtualAlloc分配虛擬內存它既是在堆是在棧而是直接在進程的地址空間中保留一塊內存

自動分配 最好的 分配 程序 保留 控制 但是 效率 申請 申請效率的比較 棧:由系統自動分配,速度較快。但程序員是無法控制的。 堆:是由new分配的內存,最好的方式是用VirtualAlloc分配虛擬內存,它

Jmeter-無法啟動'findstr'是內部或外部命令是可運行的程序

運行 root 內部 system32 重新 變量 es2017 外部命令 oot 今天有一個同事的jmeter無法安裝,於是幫他看了看,報以下錯誤: JAVA的環境變量沒有配置好,於是重新配置了下環境變量後,再啟動,發現還是不好,於是網上查了下, 發現要在電腦的環境變量

正如雲是由無數小水滴組成的一樣真正改變世界的一定是那些看起來高科技的企業一定是世界500強而是那些普普通通的人。

新人 守護 雲計算大會 王堅 傳輸 不一定 想想 站點 人事管理 從雪域高原來到秦巴山區,轉眼已是12年。這期間,吳磊守著兩條靜靜的鋼軌。 吳磊說,他不怕守,因為,“1999年,18歲應征入伍就是邊防戰士,只不過那個時候在日喀則,守的是國境,守的是國家安全,現在守的是鐵路,

哪怕悲壯的死去願平庸的活著

更多 可能 道路 算法 激活 優越感 執行 決定性 無法 哪怕悲壯的死去,也不願平庸的活著   早上醒來,突然就睡不著了。一種抑制不住要起床的感覺,並不是有什麽急事要做,但就是沒法再平靜下去了。我突然坐了起來,想到,我已經大三了。   大學的時光美好且短暫,許多光陰都無聲的

使用Xshell連接到LINUX進行vi編輯時進入編輯模式按下end鍵光標無法移到行位home能到行首其它的Delete鍵能使用如何解決?

無法 src cnblogs .com home 使用 模式 也不能 linu 使用Xshell連接到Linux進行vi編輯時,進入編輯模式,按下end鍵,光標無法移到行位,home也不能到行首,其它的Delete鍵也是不能使用,如何解決? Xshell選項設置如下: 文件

神戶制鋼坑了500家企業 百年老店為何走上邪路?(企業經營再艱難能降低產品質量甚至偷工減料同樣適用於IT行業)

目前 海外 自己 不銹鋼 但是 amp 數據 熱鬧 2015年 神戶制鋼這顆爛蘿蔔,拔出它之後帶出的泥越來越多。上周五社長川崎博也又開了記者會,再次道歉,而受到其數據造假影響的客戶數量也從200家飆升到500家。日本政府給神戶制鋼兩周時間調查,還要在一個月內公布原因和對策。