[游戏] C++ chat

一:前言

最近有朋友推荐了我一个小游戏,关于用C++聊天的,本人感觉不错,现在推荐给大家。

二:正文

本游戏分为两部分,一部分是建立服务端,一部分是加入客户端,用Dev-c++可游戏(注意在命令行中输入-lwsock32)。

1.服务端

运行服务端的exe后,输入一个端口(数字组成)。
在这里插入图片描述然后你就创建了一个服务器!(应该没有人看出那是个电话号码吧。。。)

2.客户端

如果你想加入一个服务端,那么你需要运行客户端的exe,然后输入创建服务端的电脑的IP,如下图:
在这里插入图片描述
至于怎么查看IP呢,按住Windows+r,然后在弹出的方框里输入cmd,最后输入ipconfig,如下图:
在这里插入图片描述IPv4后面的全部复制下来即可。

IP输好后,再输入对应的服务器端口,即可进入聊天室:
在这里插入图片描述更多功能等你来发现~

3.代码

1.客户端代码:

#include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <time.h>
#include <windows.h>
#include <process.h>
#include <math.h>

#define BUFLEN 2000
#define WSVERS MAKEWORD(2, 0)
#pragma comment(lib,"ws2_32.lib")

SOCKET    sock,sockets[100] = {NULL};
char    *packet = NULL;
char *pts,*input;
HANDLE hThread;
unsigned threadID;

unsigned int __stdcall Chat(PVOID PM ) {
    time_t    now;
    (void) time(&now);
    pts = ctime(&now);
    char buf[2000];

    while(1) {
        int cc = recv(sock, buf, BUFLEN, 0);
        if(cc == SOCKET_ERROR|| cc == 0) {
            printf("错误:%d.----",GetLastError());
            printf("与服务器失去连接!\n");
            CloseHandle(hThread);
            (void)closesocket(sock);
            break;
        } else if(cc > 0) {
            printf("%s\n",buf);
        }
    }
    return 0;
}

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

    time_t    now;
    (void) time(&now);
    pts = ctime(&now);

    char host[50],service[10];

    printf("请输入服务器IP地址:");
    gets(host);//IP为服务端的计算机的IP 

    printf("请输入服务器端口:");
    gets(service);//端口请自行更改 

    struct  sockaddr_in sin;
    WSADATA wsadata;
    WSAStartup(WSVERS, &wsadata);

    memset(&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_port = htons((u_short)atoi(service));
    sin.sin_addr.s_addr = inet_addr(host);

    sock = socket(PF_INET, SOCK_STREAM,0);

    system("cls");

    printf("您已连接至:\nIp:[%s]\n端口:[%s]\n\n",host,service);

    char namei[20];
    printf("请输入您的昵称:");
    gets(namei);

    connect(sock, (struct sockaddr *)&sin, sizeof(sin));

    (void) send(sock,namei, sizeof(namei), 0);

    system("cls");

    printf("*-----------------------------*\n");
    printf("|         机房聊天工具        |\n");
    printf("|          【客户端】         |\n");
    printf("|   提示:输入\'help\'查看指令  |\n");
    printf("*-----------------------------*\n");

    hThread = (HANDLE)_beginthreadex(NULL, 0,Chat, NULL, 0, &threadID);

    while(1) {

        char buf1[2000];
        gets(buf1);

        if(!strcmp(buf1 ,"help")){
            puts("");
            puts("---------------------");
            puts("机房聊天工具 命令大全");
            puts("help 查看命令");
            puts("exit 退出聊天室");
            puts("---------------------");
            puts("");
        }

        if(!strcmp(buf1 ,"exit"))
            goto end;

        (void) send(sock,buf1, sizeof(buf1), 0);

        (void) time(&now);
        pts = ctime(&now);

    }

end:
    CloseHandle(hThread);
    closesocket(sock);
    WSACleanup();

    printf("按任意键以继续...\n");
    getchar();
    return 0;
}

2.服务端代码

#include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#include <process.h>
#include <math.h>

#define QLEN 5
#define WSVERS MAKEWORD(2, 0)
#define BUFLEN 2000
#pragma comment(lib,"ws2_32.lib")

SOCKET msock, ssock;
SOCKET  sockets[100] = {NULL};

int cc;
time_t now;
char pts[64];
char buf[2000];
char *input;
HANDLE hThread1,hThread[100] = {NULL};

unsigned int threadID,ThreadID[105],number;
char *name[105];

struct  sockaddr_in fsin;
struct  sockaddr_in Sin;

unsigned int __stdcall Chat(PVOID PM) {

    (void) time(&now);
    strftime(pts,sizeof(pts),"%Y-%m-%d",localtime(&now));

    sprintf(pts,"%s.txt",pts);

    FILE *fp=fopen(pts,"a");;
    if((fp=fopen(pts,"a")) == NULL) {
        printf("ERROR:data file cannot be opened!\n");
        exit(1);
    }

    char buf1[2000];
    char buf2[2000];
    char buf3[2000];
    char buf4[2000];
    char buf15[2000];

    (void) time(&now);
    strftime(pts,sizeof(pts),"%Y,%b,%d %X %a",localtime(&now));

    fprintf(fp,"*-*-*-*-*[%s]*-*-*-*-*\n\n",pts);

    (void) time(&now);
    strftime(pts,sizeof(pts),"%X",localtime(&now));

    sockets[number] = ssock;
    SOCKET  sock = ssock;
    ThreadID[number] = threadID;
    unsigned int threadid = threadID;
    char namei[20];

    (void) recv(sock,namei, BUFLEN, 0);
    name[number]=namei;

    sprintf(buf1,"[我的进程号:%d]\n",threadid);
    sprintf(buf15,"[我的昵称:%s]\n",name[number]);

    (void) send(sock,buf1, sizeof(buf1), 0);
    (void) send(sock,buf15, sizeof(buf15), 0);
    sprintf(buf2,"<%s> %s\n加入了聊天室!\n",namei,pts);

    printf("%s",buf2);
    fprintf(fp,"%s",buf2);

    for(int i=0; i<=number; i++) {
        if(sockets[i] != NULL && sockets[i] != sock) {
            (void) send(sockets[i],buf2, sizeof(buf2), 0);
            printf("(成功将消息发送至<%d>)\n",ThreadID[i]);
        }
    }

    puts("");
    fprintf(fp,"\n");

flag1:
    cc = recv(sock, buf3, BUFLEN, 0);

    if(cc == SOCKET_ERROR || cc == 0) {

        (void) time(&now);
        strftime(pts,sizeof(pts),"%X",localtime(&now));

        sprintf( buf3,"<%s> %s\n离开了聊天室!\n",namei,pts);

        sock = NULL;
        sockets[number] = NULL;
        CloseHandle(hThread[number]);

        printf("%s", buf3);
        fprintf(fp,"%s", buf3);

        for(int i=0; i<=number; i++) {
            if(sockets[i] != NULL && sockets[i] != sock) {
                (void) send(sockets[i], buf3, sizeof(buf3), 0);
                printf("(成功将消息发送至<%d>)\n",ThreadID[i]);
            }
        }

        puts("");
        fprintf(fp,"\n");

    }

    else if(cc > 0) {

        (void) time(&now);
        strftime(pts,sizeof(pts),"%X",localtime(&now));
        sprintf(buf4,"<%s> %s\n%s\n",namei,pts,buf3);

        printf("%s",buf4);
        fprintf(fp,"%s",buf4);

        for(int i=0; i<=number; i++) {
            if(sockets[i] != NULL && sockets[i] != sock) {
                (void) send(sockets[i],buf4, sizeof(buf4), 0);
                printf("(成功将消息发送至<%d>)\n",ThreadID[i]);
            }
        }

        puts("");
        fprintf(fp,"\n");

        goto flag1;
    }
    (void) closesocket(sock);

    return 0;
}

int main(int argc, char *argv[]) {
    int alen;
    WSADATA wsadata;

    char  service[10];

    printf("请输入服务器端口:");
    gets(service);

    //注意:客户端连接服务端,IP为服务端的计算机的IP,端口为上面的service

    WSAStartup(WSVERS, &wsadata);
    msock = socket(PF_INET, SOCK_STREAM, 0);
    memset(&Sin, 0, sizeof(Sin));

    Sin.sin_family = AF_INET;
    Sin.sin_addr.s_addr = INADDR_ANY;
    Sin.sin_port = htons((u_short)atoi(service));
    bind(msock, (struct sockaddr *)&Sin, sizeof(Sin));
    listen(msock, 5);

    system("cls");

    printf("机房聊天工具【服务端】\n");
    printf("服务器端口:[%s]\n",service);

    (void) time(&now);
    strftime(pts,sizeof(pts),"%Y/%m/%d %X",localtime(&now));
    printf("时间:%s\n-----------------------\n",pts);

    number = -1;

    while(1) {

        alen = sizeof(struct sockaddr);
        ssock = accept(msock, (struct sockaddr *)&fsin, &alen);
        number ++;
        hThread[number] = (HANDLE)_beginthreadex(NULL, 0,Chat,NULL, 0, &threadID);
        //(void) recv(ssock, name[number], BUFLEN, 0);

    }

    (void) closesocket(msock);
    WSACleanup();

    return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值