網路協議的c語言程序,C語言網路編程

本文目錄一覽:

怎麼用C語言寫三次握手協議?

雖然我以前編寫過、現在已經很久沒有使用 C 語言編寫 TCP/IP 協議的三次握手協議了(即:網路 socket編程),但是我可以給你提供一個基本編程思路:首先 TCP/IP 三次握手協議是基於面向連接的網路協議,而且它是分為 server/client 進行編寫程序的。需要分別編寫 server 端、以及 client 端的代碼的,涉及到的主要函數有:bind( )、listen( )、accept( )、read( )、write( ) 等庫函數,具體的編程方法你可以參考《TCP/IP 詳解:卷 2:實現》一書。

最簡單的功能就是:在一台電腦上發送數據,而在另外一台電腦上接收數據。就有點類似功能最簡單、且無任何界面的聊天程序。

有沒有windows下c語言實現udp協議的代碼

Windows下C語言的Socket編程例子(TCP和UDP)

一。  TCP

server端:

複製代碼

 1 #include “stdafx.h”

 2 #include stdio.h

 3 #include winsock2.h

 4 

 5 #pragma comment(lib,”ws2_32.lib”)

 6 

 7 int main(int argc, char* argv[])

 8 {

 9     //初始化WSA

10     WORD sockVersion = MAKEWORD(2,2);

11     WSADATA wsaData;

12     if(WSAStartup(sockVersion, wsaData)!=0)

13     {

14         return 0;

15     }

16 

17     //創建套接字

18     SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

19     if(slisten == INVALID_SOCKET)

20     {

21         printf(“socket error !”);

22         return 0;

23     }

24 

25     //綁定IP和埠

26     sockaddr_in sin;

27     sin.sin_family = AF_INET;

28     sin.sin_port = htons(8888);

29     sin.sin_addr.S_un.S_addr = INADDR_ANY; 

30     if(bind(slisten, (LPSOCKADDR)sin, sizeof(sin)) == SOCKET_ERROR)

31     {

32         printf(“bind error !”);

33     }

34 

35     //開始監聽

36     if(listen(slisten, 5) == SOCKET_ERROR)

37     {

38         printf(“listen error !”);

39         return 0;

40     }

41 

42     //循環接收數據

43     SOCKET sClient;

44     sockaddr_in remoteAddr;

45     int nAddrlen = sizeof(remoteAddr);

46     char revData[255]; 

47     while (true)

48     {

49         printf(“等待連接…\n”);

50         sClient = accept(slisten, (SOCKADDR *)remoteAddr, nAddrlen);

51         if(sClient == INVALID_SOCKET)

52         {

53             printf(“accept error !”);

54             continue;

55         }

56         printf(“接受到一個連接:%s \r\n”, inet_ntoa(remoteAddr.sin_addr));

57         

58         //接收數據

59         int ret = recv(sClient, revData, 255, 0);        

60         if(ret  0)

61         {

62             revData[ret] = 0x00;

63             printf(revData);

64         }

65 

66         //發送數據

67         char * sendData = “你好,TCP客戶端!\n”;

68         send(sClient, sendData, strlen(sendData), 0);

69         closesocket(sClient);

70     }

71     

72     closesocket(slisten);

73     WSACleanup();

74     return 0;

75 }

複製代碼

client端:

複製代碼

 1 #include “stdafx.h”

 2 #include WINSOCK2.H

 3 #include STDIO.H

 4 

 5 #pragma  comment(lib,”ws2_32.lib”)

 6 

 7 

 8 int main(int argc, char* argv[])

 9 {

10     WORD sockVersion = MAKEWORD(2,2);

11     WSADATA data; 

12     if(WSAStartup(sockVersion, data) != 0)

13     {

14         return 0;

15     }

16 

17     SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

18     if(sclient == INVALID_SOCKET)

19     {

20         printf(“invalid socket !”);

21         return 0;

22     }

23 

24     sockaddr_in serAddr;

25     serAddr.sin_family = AF_INET;

26     serAddr.sin_port = htons(8888);

27     serAddr.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1”); 

28     if (connect(sclient, (sockaddr *)serAddr, sizeof(serAddr)) == SOCKET_ERROR)

29     {

30         printf(“connect error !”);

31         closesocket(sclient);

32         return 0;

33     }

34     char * sendData = “你好,TCP服務端,我是客戶端!\n”;

35     send(sclient, sendData, strlen(sendData), 0);

36 

37     char recData[255];

38     int ret = recv(sclient, recData, 255, 0);

39     if(ret  0)

40     {

41         recData[ret] = 0x00;

42         printf(recData);

43     }

44     closesocket(sclient);

45     WSACleanup();

46     return 0;

47 }

複製代碼

 

二. UDP

SERVER 端

複製代碼

 1 #include “stdafx.h”

 2 #include stdio.h

 3 #include winsock2.h

 4 

 5 #pragma comment(lib, “ws2_32.lib”) 

 6 

 7 int main(int argc, char* argv[])

 8 {

 9     WSADATA wsaData;

10     WORD sockVersion = MAKEWORD(2,2);

11     if(WSAStartup(sockVersion, wsaData) != 0)

12     {

13         return 0;

14     }

15 

16     SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

17     if(serSocket == INVALID_SOCKET)

18     {

19         printf(“socket error !”);

20         return 0;

21     }

22 

23     sockaddr_in serAddr;

24     serAddr.sin_family = AF_INET;

25     serAddr.sin_port = htons(8888);

26     serAddr.sin_addr.S_un.S_addr = INADDR_ANY;

27     if(bind(serSocket, (sockaddr *)serAddr, sizeof(serAddr)) == SOCKET_ERROR)

28     {

29         printf(“bind error !”);

30         closesocket(serSocket);

31         return 0;

32     }

33     

34     sockaddr_in remoteAddr;

35     int nAddrLen = sizeof(remoteAddr); 

36     while (true)

37     {

38         char recvData[255];  

39         int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)remoteAddr, nAddrLen);

40         if (ret  0)

41         {

42             recvData[ret] = 0x00;

43             printf(“接受到一個連接:%s \r\n”, inet_ntoa(remoteAddr.sin_addr));

44             printf(recvData);            

45         }

46 

47         char * sendData = “一個來自服務端的UDP數據包\n”;

48         sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)remoteAddr, nAddrLen);    

49 

50     }

51     closesocket(serSocket); 

52     WSACleanup();

53     return 0;

54 }

複製代碼

CLIENT 端

複製代碼

 1 #include “stdafx.h”

 2 #include stdio.h

 3 #include winsock2.h

 4 

 5 #pragma comment(lib, “ws2_32.lib”) 

 6 

 7 int main(int argc, char* argv[])

 8 {

 9     WORD socketVersion = MAKEWORD(2,2);

10     WSADATA wsaData; 

11     if(WSAStartup(socketVersion, wsaData) != 0)

12     {

13         return 0;

14     }

15     SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

16     

17     sockaddr_in sin;

18     sin.sin_family = AF_INET;

19     sin.sin_port = htons(8888);

20     sin.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1”);

21     int len = sizeof(sin);

22     

23     char * sendData = “來自客戶端的數據包.\n”;

24     sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)sin, len);

25 

26     char recvData[255];     

27     int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)sin, len);

28     if(ret  0)

29     {

30         recvData[ret] = 0x00;

31         printf(recvData);

32     }

33 

34     closesocket(sclient);

35     WSACleanup();

36     return 0;

37 }

c語言可以編寫通過無線網路傳輸的協議嗎?

c 語言可以。

你說不考慮硬體是不可能的,軟體是建立在硬體的基礎上的,其實能編寫通過無線網路傳輸的協議不斤只有c 語言,但是能夠和硬體緊密結合的還得數c 語言了

基於unix和linux 的無線網路傳輸的協議幾乎都是用c編寫的

請教用C語言編的藉助UDP協議實現的文件傳輸的程序

本程序在 Windows 7 Visual Studio 2015 和 Linux Ubuntu 15.04 GCC 5.11 下均編譯運行測試通過。

本程序支持 Windows 和 Linux 之間傳送文件,如果要在 Windows 和 Linux 之間傳送文件,文件名不能出現中文。

本程序支持無線 WiFi,支持 USB 收發器,但僅支持區域網內傳送文件,傳送文件需要輸入對方的 IP 地址。

本程序包括伺服器端和客戶端,既可以發送文件又可以接收文件。如果要在同一台機器上測試需要同時打開兩個程序。

Windows 下查看本機 IP 地址的命令是:

ipconfig

Linux 下查看本機 IP 地址的命令是:

ifconfig

以下是程序代碼:

#includestdio.h

#includestdlib.h

#includestring.h

#includemath.h

#ifdef _MSC_VER

    #includewinsock2.h

    #includewindows.h

    #pragma comment(lib, “ws2_32.lib”)

#else

    #includepthread.h

    #includeunistd.h

    #includesignal.h

    #includesys/socket.h

    #includearpa/inet.h

#endif

// 存放發送接收字元數組大小

#define SIZEA 65501

// 每次發送接收位元組數

#define SIZEB 65500

typedef struct sockaddr_in SockAddrIn;

SockAddrIn serverAddr, remoteAddr, clientAddr;

// 埠號

int iServerPort, iClientPort;

// 新建 socket 信息

int iUDP;

// 字元串轉整型

int strToInt(char* acStr)

{

    int i, iIndex = 0, iNum = 0, iSize = 0;

    if(acStr[0] == ‘+’ || acStr[0] == ‘-‘)

        iIndex = 1;

    for(iSize=iIndex; ; iSize++)

        if(acStr[iSize]  ‘0’ || acStr[iSize]  ‘9’)

            break;

    for(i=iIndex; iiSize; i++)

        iNum += (int)pow(10, iSize – i – 1) * (acStr[i] – 48);

    if(acStr[0] == ‘-‘)

        iNum = – iNum;

    return iNum;

}

// 整型轉字元串

void intToStr(int iInt, char* acStr)

{

    int iIndex = 0, iSize, iNum, iBit, i, j;

    if(iInt  0)

    {

        acStr[0] = ‘-‘;

        iInt = – iInt;

        iIndex = 1;

    }

    for(i=0; ; i++)

        if(iInt  pow(10, i))

            break;

    iSize = i;

    for(i=0; iiSize; i++)

    {

        iNum = pow(10, iSize – i – 1);

        iBit = iInt/iNum;

        iInt -= iNum*iBit;

        acStr[i + iIndex] = iBit + 48;

    }

    if(iSize != 0)

        acStr[iSize + iIndex] = ‘\0’;

    else

    {

        acStr[0] = ‘0’;

        acStr[1] = ‘\0’;

    }

}

void sleepUDP(int iSleep)

{

#ifdef _MSC_VER

    Sleep(iSleep);

#else

    usleep(iSleep*1000);

#endif

}

void openUDP(char* acIpAddr)

{

#ifdef _MSC_VER

    // Winsows 啟用 socket

    WSADATA wsadata;

    if(WSAStartup(MAKEWORD(1, 1), wsadata) == SOCKET_ERROR)

    {

        printf(“啟用 socket 失敗\n”);

        exit(0);

    }

#endif

    // 新建 socket

    if((iUDP = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)

    {

        printf(“新建 socket 失敗\n”);

        exit(0);

    }

    // 清零

    memset(serverAddr, 0, sizeof(serverAddr));

    memset(clientAddr, 0, sizeof(clientAddr));

    // 設置協議 IP 地址及 Port

    serverAddr.sin_family = AF_INET;

    serverAddr.sin_port = htons(iServerPort);

    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

    clientAddr.sin_family = AF_INET;

    clientAddr.sin_port = htons(iClientPort);

    clientAddr.sin_addr.s_addr = inet_addr(acIpAddr);

    // 綁定埠,監聽埠

    if(bind(iUDP, (struct sockaddr*)serverAddr, sizeof(serverAddr)) == -1)

    {

        printf(“綁定埠失敗\n”);

        exit(0);

    }

}

void closeUDP(void)

{

#ifdef _MSC_VER

    // Winsows 關閉 socket

    closesocket(iUDP);

    WSACleanup();

#endif

}

// 要發送的字元串

char acSendStr[SIZEA];

// 接收到的字元串

char acRecvStr[SIZEA];

// 請求信息

char acReq[SIZEA];

// 文件名字元串

char acFileName[SIZEA];

// 文件位元組數字元串

char acFileSize[SIZEA];

int iSize, iNameSize;

// 接收文件名

#ifdef _MSC_VER

DWORD WINAPI recvName(LPVOID p)

#else

void* recvName(void* arg)

#endif

{

    int iAddrSize = sizeof(remoteAddr);

    acReq[0] = ‘n’; acReq[1] = ‘a’; acReq[2] = ‘m’; acReq[3] = ‘e’; acReq[4] = ‘\0’;

    acRecvStr[0] = ‘\0’;

    printf(“%s\n”, “正在發送請求信息!”);

    // 發送請求信息

    sendto(iUDP, acReq, strlen(acReq), 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

    // 每次發送請求信息後等待一段時間

    sleepUDP(10);

    // 接收文件名

    iSize = recvfrom(iUDP, acRecvStr, SIZEB, 0, (struct sockaddr*)remoteAddr, iAddrSize);

    return 0;

}

// 接收文件

void recvFile(char* acDirName, char* acIpAddr)

{

    FILE* pFile = NULL;

    int i, iFileSize, iRecvNum, iAddrSize = sizeof(remoteAddr);

    // 路徑文件名

    char acDirAndFileName[SIZEA];

    openUDP(acIpAddr);

    // 接收文件名

    for(;;)

    {

        // 創建線程

        #ifdef _MSC_VER

            HANDLE hThread;

            DWORD threadId;

            hThread = CreateThread(NULL, 0, recvName, 0, 0, threadId);

            // 每次發送後等待一段時間

            sleepUDP(1000);

            // 強制終止線程

            TerminateThread(hThread, 0);

        #else

            pthread_t thread;

            void* thread_arg = (pthread_t)0;

            pthread_create(thread, NULL, recvName, (void*)thread_arg);

            // 每次發送後等待一段時間

            sleepUDP(1000);

            // 強制終止線程

            pthread_cancel(thread);

        #endif

        if(acRecvStr[0] != ‘\0’)

        {

            acRecvStr[iSize] = ‘\0’;

            printf(“文件名為:%s\n”, acRecvStr);

            break;

        }

    }

    acDirAndFileName[0] = ‘\0’;

    strcat(acDirAndFileName, acDirName);

    // 連接路徑名和文件名

    strcat(acDirAndFileName, acRecvStr);

    // 如果已經有這個文件了就清空文件內容

    pFile = fopen(acDirAndFileName, “w”);

    fclose(pFile);

    acReq[0] = ‘s’; acReq[1] = ‘i’; acReq[2] = ‘z’; acReq[3] = ‘e’; acReq[4] = ‘\0’;

    // 接收文件位元組數

    for(;;)

    {

        // 發送請求信息

        sendto(iUDP, acReq, strlen(acReq) + 1, 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

        // 每次發送請求信息後等待一段時間

        sleepUDP(10);

        // 接收文件位元組數

        acRecvStr[0] = ‘\0’;

        iSize = recvfrom(iUDP, acRecvStr, SIZEB, 0, (struct sockaddr*)remoteAddr, iAddrSize);

        if(acRecvStr[0] != ‘\0’)

        {

            acRecvStr[iSize] = ‘\0’;

            iFileSize = strToInt(acRecvStr);

            printf(“文件位元組數為:%d\n”, iFileSize);

            break;

        }

    }

    // 以追加方式寫入文件

    pFile = fopen(acDirAndFileName, “ab”);

    // 文件分幾次接收

    iRecvNum = iFileSize/SIZEB;

    // 接收文件

    for(i=0; iiRecvNum; i++)

    {

        intToStr(i, acReq);

        for(;;)

        {

            // 發送請求信息

            sendto(iUDP, acReq, strlen(acReq) + 1, 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

            printf(“%s\t正在接收文件的第 %d 段\n”, acReq, i);

            // 每次發送請求信息後等待一段時間

            sleepUDP(10);

            // 接收一段文件

            iSize = recvfrom(iUDP, acRecvStr, SIZEB, 0, (struct sockaddr*)remoteAddr, iAddrSize);

            if(iSize == SIZEB)

            {

                // 以追加方式寫入文件

                fwrite(acRecvStr, sizeof(char), iSize, pFile);

                break;

            }

        }

    }

    // 接收文件剩餘位元組

    iSize = iFileSize%SIZEB;

    if(iSize  0)

    {

        acReq[0] = ‘l’; acReq[1] = ‘a’; acReq[2] = ‘s’; acReq[3] = ‘t’; acReq[4] = ‘\0’;

        for(;;)

        {

            // 發送請求信息

            sendto(iUDP, acReq, strlen(acReq) + 1, 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

            // 每次發送請求信息後等待一段時間

            sleepUDP(10);

            // 接收文件剩餘位元組

            if(recvfrom(iUDP, acRecvStr, iSize, 0, (struct sockaddr*)remoteAddr, iAddrSize) == iSize)

            {

                // 以追加方式寫入文件

                fwrite(acRecvStr, sizeof(char), iSize, pFile);

                break;

            }

        }

    }

    printf(“%s\n”, “文件接收完畢!”);

    // 關閉文件

    fclose(pFile);

    // 關閉連接

    closeUDP();

}

// 發送文件名

#ifdef _MSC_VER

DWORD WINAPI sendName(LPVOID p)

#else

void* sendName(void* arg)

#endif

{

    int iAddrSize = sizeof(remoteAddr);

    acRecvStr[0] = ‘\0’;

    // 接收請求

    printf(“%s\n”, “正在接收請求信息!”);

    recvfrom(iUDP, acRecvStr, 5, 0, (struct sockaddr*)remoteAddr, iAddrSize);

    // 每次接收請求信息後等待一段時間

    sleepUDP(10);

    // 如果請求信息正確發送文件名

    if(acRecvStr[0] == ‘n’  acRecvStr[1] == ‘a’  acRecvStr[2] == ‘m’  acRecvStr[3] == ‘e’  acRecvStr[4] == ‘\0’)

        sendto(iUDP, acFileName, iNameSize, 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

    return 0;

}

// 發送文件

void sendFile(char* acDirAndFileName, char* acIpAddr)

{

    int i, j, iFileSize, iSendNum, iAddrSize = sizeof(remoteAddr);

    FILE* pFile = NULL;

    pFile = fopen(acDirAndFileName, “rb”);

    fseek(pFile, 0, SEEK_END);

    // 文件位元組數

    iFileSize = ftell(pFile);

    intToStr(iFileSize, acFileSize);

    //printf(“%s\n”, acDirAndFileName);

    // 獲取文件名長度

    iSize = strlen(acDirAndFileName);

    for(i=iSize-1, iNameSize=0; i=0; i–,iNameSize++)

        if(acDirAndFileName[i] == ‘\\’ || acDirAndFileName[i] == ‘/’)

            break;

    //printf(“%d\n”, iNameSize);

    // 截取文件名

    for(i=0; iiNameSize; i++)

        acFileName[i] = acDirAndFileName[iSize – iNameSize + i];

    acFileName[iNameSize] = ‘\0’;

    //printf(“%s\n”, acFileName);

    openUDP(acIpAddr);

    // 發送文件名

    for(;;)

    {

    // 創建線程

    #ifdef _MSC_VER

        HANDLE hThread;

        DWORD threadId;

        hThread = CreateThread(NULL, 0, sendName, 0, 0, threadId);

        // 每次接收請求信息後等待一段時間

        sleepUDP(1000);

        // 強制終止線程

        TerminateThread(hThread, 0);

    #else

        pthread_t thread;

        void* thread_arg = (pthread_t)0;

        pthread_create(thread, NULL, sendName, (void*)thread_arg);

        // 每次接收請求信息後等待一段時間

        sleepUDP(1000);

        // 強制終止線程

        pthread_cancel(thread);

    #endif

        // 如果請求信息正確退出循環

        if(acRecvStr[0] == ‘n’  acRecvStr[1] == ‘a’  acRecvStr[2] == ‘m’  acRecvStr[3] == ‘e’  acRecvStr[4] == ‘\0’)

            break;

    }

    // 發送文件位元組數

    for(;;)

    {

        acRecvStr[0] = ‘\0’;

        // 接收請求

        recvfrom(iUDP, acRecvStr, 5, 0, (struct sockaddr*)remoteAddr, iAddrSize);

        // 每次接收請求信息後等待一段時間

        sleepUDP(10);

        // 如果請求信息正確

        if(acRecvStr[0] == ‘s’  acRecvStr[1] == ‘i’  acRecvStr[2] == ‘z’  acRecvStr[3] == ‘e’  acRecvStr[4] == ‘\0’)

        {

            // 發送文件位元組數

            sendto(iUDP, acFileSize, strlen(acFileSize), 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

            break;

        }

    }

    iSendNum = iFileSize/SIZEB;

    // 發送文件

    if(iSendNum  0)

    {

        for(i=0;;i++)

        {

            acRecvStr[0] = ‘\0’;

            // 接收請求

            recvfrom(iUDP, acRecvStr, SIZEB, 0, (struct sockaddr*)remoteAddr, iAddrSize);

            printf(“%s\t正在發送文件的第 %d 段\n”, acRecvStr, i);

            // 每次接收請求信息後等待一段時間

            sleepUDP(10);

            fseek(pFile, strToInt(acRecvStr)*SIZEB, SEEK_SET);

            fread(acSendStr, 1, SIZEB, pFile);

            //printf(“%s\n”, acSendStr);

            // 發送一段文件

            sendto(iUDP, acSendStr, SIZEB, 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

            if(strToInt(acRecvStr) = iSendNum – 1)

                break;

        }

    }

    // 發送文件剩餘位元組

    iSize = iFileSize%SIZEB;

    if(iSize  0)

    {

        for(;;)

        {

            acRecvStr[0] = ‘\0’;

            // 接收請求

            recvfrom(iUDP, acRecvStr, 5, 0, (struct sockaddr*)remoteAddr, iAddrSize);

            // 每次接收請求信息後等待一段時間

            sleepUDP(10);

            // 如果請求信息正確

            if(acRecvStr[0] == ‘l’  acRecvStr[1] == ‘a’  acRecvStr[2] == ‘s’  acRecvStr[3] == ‘t’  acRecvStr[4] == ‘\0’)

            {

                fseek(pFile, iSendNum*SIZEB, SEEK_SET);

                fread(acSendStr, 1, iSize, pFile);

                //printf(“%s\n”, acSendStr);

                // 發送文件剩餘位元組

                sendto(iUDP, acSendStr, iSize, 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

                break;

            }

        }

    }

    printf(“%s\n”, “文件發送完畢!”);

    // 關閉連接

    closeUDP();

}

int main(void)

{

    char acDirName[SIZEA];

    char acDirAndFileName[SIZEA];

    char acIpAddr[15];

    int i, iOption = 0, iSize = 0;

    FILE* pFile = NULL;

    char cLast = ‘\\’;

option:

    printf(“%s\n”, “****************************************************\n本程序包括伺服器端和客戶端,既可以發送文件又可以接收文件。\n支持無線 WiFi,支持 USB 收發器,但僅支持區域網內傳送文件。\n如果要在 Windows 和 Linux 之間傳送文件,文件名不能出現中文。\n如果要在同一台機器上測試需要同時打開兩個程序。\n****************************************************”);

    printf(“%s\n”, “請輸入選項,1.發送文件、2.接收文件。”);

    scanf(“%d”, iOption);

    // 發送文件

    if(iOption == 1)

    {

        iServerPort = 1025;

        iClientPort = 1024;

    fileName:

        printf(“%s\n”, “請輸入需要發送的路徑文件名。\nWindows 路徑文件名格式:\t\tC:\\install.txt\nLinux 路徑文件名格式:\t\t/home/install.txt”);

        scanf(“%s”, acDirAndFileName);

        pFile = fopen(acDirAndFileName, “rb”);

        if(pFile == NULL)

        {

            printf(“%s\n”, “讀取文件失敗,請重新輸入文件名。”);

            goto fileName;

        }

        // 關閉文件

        fclose(pFile);

        printf(“%s\n”, “請輸入接收文件方的 IP 地址,不能有空格。\n例如:\n192.168.1.104”);

        scanf(“%s”, acIpAddr);

        sendFile(acDirAndFileName, acIpAddr);

    }

    // 接收文件

    else if(iOption == 2)

    {

        iServerPort = 1024;

        iClientPort = 1025;

    dirName:

        printf(“%s\n”, “請輸入保存文件的路徑名。\nWindows 路徑名格式:\t\tC:\\img\\\nLinux 路徑名格式:\t\t/home/”);

        scanf(“%s”, acDirName);

        iSize = strlen(acDirName);

        // 檢查是不是 Linux 路徑名

        for(i=0; iiSize; i++)

        {

            if(acDirName[i] == ‘/’)

            {

                cLast = ‘/’;

                break;

            }

        }

        // 檢查路徑名最後一個字元是不是 \ 或 /

        if(acDirName[iSize – 1] != cLast)

        {

            acDirName[iSize] = cLast;

            acDirName[iSize + 1] = ‘\0’;

        }

        acDirAndFileName[0] = ‘\0’;

        strcat(acDirAndFileName, acDirName);

        strcat(acDirAndFileName, “a.txt”);

        // 試探保存一個無關緊要的文件

        pFile = fopen(acDirAndFileName, “w”);

        if(pFile == NULL)

        {

            printf(“%s\n”, “該路徑無法創建文件,請重新輸入路徑名。”);

            goto dirName;

        }

        else

        {

            // 關閉文件

            fclose(pFile);

            // 刪除文件

            remove(acDirAndFileName);

        }

        printf(“%s\n”, “請輸入發送文件方的 IP 地址,不能有空格。\n例如:\n192.168.2.249”);

        scanf(“%s”, acIpAddr);

        recvFile(acDirName, acIpAddr);

    }

    else

    {

        printf(“%s\n”, “沒有這個選項,請重新輸入。”);

        goto option;

    }

    return 0;

}

用c語言完成關於【網路協議分析】的「圖形界面」編程該如何操作

以下代碼是徹底的C語言,外加Windows API 函數,不含絲毫的C++語言成分,在Visual C++ 6.0測試通過,能夠出現一個正規的Windows窗口

#pragma comment(linker,”/SUBSYSTEM:Windows  /ENTRY:mainCRTStartup”)

 

#include windows.h

 

/* 使類名成為全局變數 */

TCHAR szClassName[ ] = TEXT(“WindowsApp”);

 

/* 這個函數由函數DispatchMessage()調用 */

LRESULT CALLBACK WindowProcedure (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

HDC hdc ;

PAINTSTRUCT ps ;

RECT rect ;

switch (message)  /* 處理信息 */

{

case WM_DESTROY:

PostQuitMessage (0);  /* 發送WM_QUIT到消息隊列 */

break;

case WM_PAINT:

hdc = BeginPaint (hWnd, ps) ;

GetClientRect (hWnd, rect) ;

DrawText (hdc, TEXT(“Hello, Windows NT!”), -1, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;

EndPaint (hWnd, ps) ;

break ;

default:  /* 不處理的消息 */

return DefWindowProc (hWnd, message, wParam, lParam);

}

return 0;

}

/* 下面是主函數 */

int main ( void )  

{

HINSTANCE hThisInstance = GetModuleHandle(NULL) ;

int nFunsterStil = SW_SHOW ;

HWND hWnd; /* 這是窗口的句柄 */

MSG messages;/* 應用程序的消息保存在這裡 */

WNDCLASSEX wincl;/* 窗口類的數據結構 */

 

/* 窗口結構 */

wincl.hInstance = hThisInstance;

wincl.lpszClassName = szClassName;

wincl.lpfnWndProc = WindowProcedure;/* 這個函數由Windows操作系統調用 */

wincl.style = CS_DBLCLKS; /* 獲取雙擊指令 */

wincl.cbSize = sizeof (WNDCLASSEX);

/* 使用默認圖標和滑鼠指針 */

wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

wincl.hCursor = LoadCursor (NULL, IDC_ARROW);

wincl.lpszMenuName = NULL; /* 沒有菜單 */

wincl.cbClsExtra = 0;/* 窗口類後面沒有多餘的位元組 */

wincl.cbWndExtra = 0;/* 結構或者窗口實例 */

/* 使用窗口的默認顏色作為窗口的背景色 */

wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

 

/* 註冊窗口類。如果註冊失敗,那麼就退出程序 */

if (!RegisterClassEx (wincl))

return 0;

 

/* 窗口類已被註冊。創建它的程序 */

hWnd = CreateWindowEx (

0,

szClassName, /* 類名 */

TEXT(“Windows App”), /* 窗口標題欄的文字 */

WS_OVERLAPPEDWINDOW, /* 默認窗口 */

CW_USEDEFAULT, /* 窗口左上角的位置 */

CW_USEDEFAULT, /* 窗口右下角的位置 */

544, /* 窗口寬度(以「像素」位單位) */

375, /* 窗口高度(以「像素」位單位) */

HWND_DESKTOP,/* 窗口是桌面的子窗口 */

NULL,/* 該窗口無菜單 */

hThisInstance, /* 程序實例的句柄 */

NULL /* 沒有窗口創建的數據 */

);

 

/* 顯示窗口 */

ShowWindow (hWnd, nFunsterStil);

/* 重繪窗口 */

UpdateWindow(hWnd);

 

/* 運行消息循環。循環到GetMessage()函數返回0 */

while (GetMessage (messages, NULL, 0, 0))

{

/* 把虛擬信息翻譯成字元信息 */

TranslateMessage(messages);

/* 發送信息到窗口過程 */

DispatchMessage(messages);

}

 

/* 返回PostQuitMessage()函數的返回值 */

return messages.wParam;

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249374.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 17:13
下一篇 2024-12-12 17:13

相關推薦

  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序文件的拓展

    Python是一門功能豐富、易於學習、可讀性高的編程語言。Python程序文件通常以.py為文件拓展名,被廣泛應用於各種領域,包括Web開發、機器學習、科學計算等。為了更好地發揮P…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python購物車程序

    Python購物車程序是一款基於Python編程語言開發的程序,可以實現購物車的相關功能,包括商品的添加、購買、刪除、統計等。 一、添加商品 添加商品是購物車程序的基礎功能之一,用…

    編程 2025-04-29
  • 爬蟲是一種程序

    爬蟲是一種程序,用於自動獲取互聯網上的信息。本文將從如下多個方面對爬蟲的意義、運行方式、應用場景和技術要點等進行詳細的闡述。 一、爬蟲的意義 1、獲取信息:爬蟲可以自動獲取互聯網上…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Vb運行程序的三種方法

    VB是一種非常實用的編程工具,它可以被用於開發各種不同的應用程序,從簡單的計算器到更複雜的商業軟體。在VB中,有許多不同的方法可以運行程序,包括編譯器、發布程序以及命令行。在本文中…

    編程 2025-04-29
  • Python一元二次方程求解程序

    本文將詳細闡述Python一元二次方程求解程序的相關知識,為讀者提供全面的程序設計思路和操作方法。 一、方程求解 首先,我們需要了解一元二次方程的求解方法。一元二次方程可以寫作: …

    編程 2025-04-29

發表回復

登錄後才能評論