您的位置:

网络协议的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;

}