自建服务器和客户端小应用

<pre name="code" class="cpp">/*服务器*/
#pragma comment (lib, "w2_32.lib")
#include <stdio.h>
#include <winsock2.h>
#include <time.h>
SOCKET clntSock;
SOCKET servSock;
struct tm * timeinfo;//上次调用时间获取函数后的时间
char * TimeStr;//存储时间的字符串
char Str_Recv[MAXBYTE] = {0};//定义一个键盘接收到的字符串数组
char Str_Send[MAXBYTE] = {0};//定义一个键盘输入的字符串数组
void TCP_Server(void);//建立连接
void InterFace(void);//首界面
void GetTime(boolean flag);//得到时间,选择是否打印已经存储
void GetFromKey(void);//得到键盘信息
void RecvPrint(void);//得到信息并打印
void Func(void);//功能界面

int main()
{
    char ch = 'Y';
    InterFace();
    TCP_Server();

    while(ch != 'N')
    {
        fflush(stdin);
        Func();//服务器功能界面
        scanf("%c",&ch);
        switch(ch)
        {
            case 'A':
                printf("Waiting for client's message...\n");
                RecvPrint();
                break;
            case 'B':
                printf("Waiting for the client ready to receive...\n");
                recv(clntSock,Str_Recv,MAXBYTE,NULL);
                while(strcmp(Str_Recv,"Ready to receive") != 0);//得到的数据为准备好接收在进行发送后,退出循环
                printf("Client is waiting\n");
                GetFromKey();
                send(clntSock, Str_Send, strlen(Str_Send)+sizeof(char), NULL);
                printf("\nSuccess to send message to client\n");
                break;
            case 'C':
                printf("\n");
                GetTime(0);
                break;
            case 'D':
                printf("Waiting for client's command...\n");//等待客户端的命令
                recv(clntSock,Str_Recv,MAXBYTE,NULL);//得到命令
                if(strcmp(Str_Recv,"Time") == 0)
                {
                    GetTime(1);
                    send(clntSock, TimeStr, strlen(TimeStr)+sizeof(char), NULL);
                    printf("\nSuccess to send system's time to client\n");
                }
                else if(strcmp(Str_Recv,"Alarm") == 0)
                    printf("\a\a\nServer alarm...\n");
                else
                {
                    printf("Command error!\n");
                }
                break;
            case 'E':
                system("CLS");
                break;
            case 'N':
                break;
			default:
				printf("Enter Illigelly!\n");
				break;
        }
        fflush(stdin);
    }
    closesocket(clntSock);
    closesocket(servSock);
    WSACleanup();
    return 0;
}
//************************************************************
//输入参数:无
//函数作用:得到客户消息,并打印出来
//函数返回:无
//************************************************************
void RecvPrint(void)
{
    recv(clntSock,Str_Recv,MAXBYTE,NULL);
    printf("\nMessage from client:%s\n",Str_Recv);
}
//************************************************************
//输入参数:无
//函数作用:用户初始界面
//函数返回:无
//************************************************************
void InterFace(void)
{
    printf("\nAuthor:Song Chaochao\n");
    printf("Version:1.0\n");
    GetTime(0);
    printf("\n************************        Server         *************************\n");
}
//************************************************************
//输入参数:无
//函数作用:服务器功能界面
//函数返回:无
//************************************************************
void Func(void)
{
    printf("\n* * * * * * * * * * * * * * * *\n");
    printf("****         Menu          ****\n");
    printf("* * * * * * * * * * * * * * * *\n");
    printf("*     A:Receive              *\n");
    printf("*     B:Send                 *\n");
    printf("*     C:Get system's time    *\n");
    printf("*     D:Get command          *\n");
    printf("*     E:Clear screen         *\n");
    printf("*     N:Quit                 *\n");
    printf("*     Please enter leter!     *\n");
    printf("* * * * * * * * * * * * * * * *\n");
}
//************************************************************
//输入参数:输入flag = 1:输出成功存储;flag = 0;不输出成功存储
//函数作用:得到系统时间,存放在结构体timeinfo中,
//          并将时间字符串存放在TimeStr中
//函数返回:无
//************************************************************
void GetTime(boolean flag)
{
    time_t rawtime;
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    printf ( "\007Date/Time: %s", TimeStr = asctime (timeinfo) );
    if(flag == 1)
        printf("Succes to save time into char * TimeStr\n");
}
//************************************************************
//输入参数:无
//函数作用:建立套接字,准备和客户端连接
//函数返回:无
//************************************************************
void TCP_Server(void)
{
    //初始化 DLL
    WSADATA wsaData;
    //设置winsock版本号
    WSAStartup( MAKEWORD(2, 2), &wsaData);
    //创建套接字
    servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);//AF_INET,代表internet 地址族;SOCK_STREAM代表TCP;IPPROTO_IP=0,目前无用
    //绑定套接字
    struct sockaddr_in sockAddr;
    memset(&sockAddr, 0, sizeof(sockAddr));  //每个字节都用0填充
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");  //具体的IP地址
     //16位端口号
    sockAddr.sin_port = htons(1234);
    //servSock是由socket()调用返回的并且未作连接的套接字描述符(套接字号),将其与本地地址连接
    bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
    //打印等待客户
    printf("Waiting for client...\n");
    //进入监听状态
    listen(servSock, 20);//等待连接的最大队列长度20

    //接收客户端请求
    SOCKADDR clntAddr;
    int nSize = sizeof(SOCKADDR);
    clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
    printf("\nSuccess to connect...\n\n");
    //向客户端发送数据
    char *str = "\nSuccess to connect...\n";
    send(clntSock, str, strlen(str)+sizeof(char), NULL);
}
//************************************************************
//输入参数:无
//函数作用:从键盘得到信息,存放在数组STR
//函数返回:无
//************************************************************
void GetFromKey(void)
{
    fflush(stdin);//输入前清除回车等
    printf("Please enter your massage:");
    gets(Str_Send);//得到要发送的字符串
}



/*客户端*/
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")  //加载 ws2_32.dll
#define TXTSTR_MAX 100
#define TIME_MAX 50
char TimeStr[TIME_MAX];//存储时间的字符串
char *TimeSave;//用来存储不显示的时间字符串
char Str_Recv[MAXBYTE] = {0};//定义一个键盘接收到的字符串数组
char Str_Send[MAXBYTE] = {0};//定义一个键盘输入的字符串数组
char *TXTSTR = {0};//存放读出txt的数据
char filename[FILENAME_MAX] = "PROCESS.txt";
SOCKET servSock;
SOCKET sock;
void GetTime(boolean flag);//提取时间
void InterFace(void);//首界面
void Func(void);//功能界面
void TCP_Client(void);//套接字的初始化和连接
void RecvPrint(void);//接收并打印
void TxtWrite(char *address,char *TxtStr1,char *TxtStr2,char *TxtStr3,char *TxtStr4);//文件写操作
void TxtPrintf(char *address);//文件读操作
void GetFromKey(void);//得到键盘发过来的信息

int main()
{
    char ch = 'Y';//除了ch=‘N’之外,都继续运行
    char *str;
    InterFace();
    TCP_Client();
    Func();
    scanf("%c",&ch);//第一次得到命令
    while(ch != 'N')
    {
        switch(ch)
        {
            case 'A':
                GetFromKey();
                send(sock,Str_Send,strlen(Str_Send)+sizeof(char), NULL);
                printf("\nSuccess to send your message!\n");
                GetTime(0);
                TxtWrite(filename,"\nSend message to Server:",Str_Send,"\n",TimeSave);
                break;
            case 'B':
                str = "Ready to receive";
                send(sock,str,strlen(str)+sizeof(char), NULL);
                printf("waiting for message...\n");
                RecvPrint();
                GetTime(0);
                TxtWrite(filename,"\nReiceve message from server:",Str_Recv,"\n",TimeSave);
                break;
            case 'C':
                GetTime(1);
                TxtWrite(filename,"Get system's Time:",TimeSave,"",TimeSave);
                break;
            case 'D':
                str = "Time";
                send(sock,str,strlen(str)+sizeof(char), NULL);
                recv(sock, TimeStr, MAXBYTE, NULL);
                printf("\nServer time is:%s\n\n",TimeStr);
                GetTime(0);
                TxtWrite(filename,"Get Server's Time:",TimeStr,"",TimeSave);
                break;
            case 'E':
                str = "Alarm";
                send(sock,str,strlen(str)+sizeof(char), NULL);
                printf("\nSuccess to make server alarm!\n\n",TimeStr);
                GetTime(0);
                TxtWrite(filename,"Make server alarm","","\n",TimeSave);
                break;
            case 'F':
                TxtPrintf(filename);
                break;
            case 'G':
                system("CLS");
                break;
             case 'N':
                printf("\a\n\nQuit\n\n");
                return 0;
            default:
                printf("Enter Illigelly!\n\a");
                break;
        }
        fflush(stdin);
        Func();
        scanf("%c",&ch);
    }
    //关闭套接字
    closesocket(sock);
    //终止使用 DLL
    WSACleanup();
    system("pause");
    return 0;
}
//************************************************************
//输入参数:flag = 0:不打印时间;flag = 1:打印时间
//函数作用:得到本系统的时间
//函数返回:无
//************************************************************
void GetTime(boolean flag)
{
    time_t rawtime;
    struct tm * timeinfo;
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    TimeSave = asctime (timeinfo);
    if(flag == 1)
        printf ( "\007Date/Time: %s", asctime (timeinfo) );
}
//************************************************************
//输入参数:无
//函数作用:客户端初始化界面
//函数返回:无
//************************************************************
void InterFace(void)
{
    printf("\nAuthor:Song Chaochao\n");
    printf("Version:1.0\n");
    GetTime(1);
    printf("\n************************        Client           *************************\n");
}
//************************************************************
//输入参数:无
//函数作用:客户端功能界面
//函数返回:无
//************************************************************
void Func(void)
{
    printf("\n* * * * * * * * * * * * * * * *\n");
    printf(" ****         Menu         ****\n");
    printf("* * * * * * * * * * * * * * * *\n");
    printf("*     A:Send                 *\n");
    printf("*     B:Reiceve              *\n");
    printf("*     C:Get system's time    *\n");
    printf("*     D:Get server's time    *\n");
    printf("*     E:Server alarms        *\n");
    printf("*     F:Previous step        *\n");
    printf("*     G:Clear screen         *\n");
    printf("*     N:Quit                 *\n");
    printf("*     Please enter leter!     *\n");
    printf("* * * * * * * * * * * * * * * *\n");
}
//************************************************************
//输入参数:无
//函数作用:建立套接字
//函数返回:无
//************************************************************
void TCP_Client(void)
{
    //初始化DLL
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    //创建套接字
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    //向服务器发起请求
    SOCKADDR_IN sockAddr;
    memset(&sockAddr, 0, sizeof(sockAddr));  //每个字节都用0填充
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    sockAddr.sin_port = htons(1234);
    int nSize = sizeof(SOCKADDR);
    servSock = connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
    recv(sock, Str_Recv, MAXBYTE, NULL);
    printf("Message form server: %s\n", Str_Recv);

}
//************************************************************
//输入参数:无
//函数作用:接收来自服务器的信息,并打印出来
//函数返回:无
//************************************************************
void RecvPrint(void)
{
        //接收服务器传回的数据
    recv(sock, Str_Recv, MAXBYTE, NULL);
    printf("Message form server: %s\n", Str_Recv);

}
//************************************************************
//输入参数:文件名和要输入的内容
//函数作用:输入操作内容到txt文件
//函数返回:无
//************************************************************
void TxtWrite(char *address,char *TxtStr1,char *TxtStr2,char *TxtStr3,char *TxtStr4)
{
    FILE* fp;
	fp = fopen(address,"w");  // 打开文件,地址report.txt
	if(fp == NULL)
	{
		printf("cannot open this file\n");      //不能打开文件
		exit(0);
	}
    fprintf(fp,TxtStr1);
    fprintf(fp,TxtStr2);
    fprintf(fp,TxtStr3);
    fprintf(fp,TxtStr4);
    fclose(fp);
}
//************************************************************
//输入参数:文件名
//函数作用:输出文件的内容
//函数返回:无
//************************************************************
void TxtPrintf(char *address)
{
	FILE* fp;
	fp = fopen(address,"r");  // 打开文件,地址sample.txt
	if(fp == NULL)
	{
		printf("cannot open this file\n");      //不能打开文件
		exit(0);
	}
	printf("\nThe previous step:\n");
	while(!feof(fp))
         putchar(fgetc(fp));
	fclose(fp);   //关闭文件
}
//************************************************************
//输入参数:无
//函数作用:从键盘得到信息,存放在数组STR
//函数返回:无
//************************************************************
void GetFromKey(void)
{
    fflush(stdin);//输入前清除回车等
    printf("Please enter your massage:");
    gets(Str_Send);//得到要发送的字符串
}

</pre><pre name="code" class="cpp">
</pre><pre name="code" class="cpp">


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值