聊天室程序客户端

聊天室客户端程序 Windows控制台应用程序

 

对应的Linux服务器使用select模型实现:

 

Linux下select函数实现的聊天服务器 

http://blog.csdn.net/microtong/archive/2009/12/12/4989902.aspx 

 

运行命令行为:Client.exe 127.0.0.1 8000

 

命令行参数分别为要连接的IP地址和端口

 

view plaincopy to clipboardprint?

//Client.cpp   

#include <winsock2.h>   

#include <stdio.h>   

#include <windows.h>   

//引入静态链接库   

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

//缓冲区大小   

#define BUFFER_SIZE  4096   

//用来修改用户姓名的命令   

const char* CMD_NAME="name";   

//用来退出系统的命令   

const char* CMD_BYE="bye";   

//负责接收数据的线程   

DWORD WINAPI ReceiveThreadProc( LPVOID lpParameter);   

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

    //判断是否输入了IP地址和端口号   

    if(argc!=3){   

        printf("Usage: %s IPAddress PortNumber\n",argv[0]);   

        exit(-1);   

    }   

    //把字符串的IP地址转化为u_long   

    unsigned long ip;   

    if((ip=inet_addr(argv[1]))==INADDR_NONE){   

        printf("不合法的IP地址:%s",argv[1]);   

        exit(-1);   

    }   

    //把端口号转化成整数   

    short port;   

    if((port = atoi(argv[2]))==0){   

        printf("端口号有误!");   

        exit(-1);   

    }   

    printf("Connecting to %s:%d......\n",inet_ntoa(*(in_addr*)&ip),port);   

    WSADATA wsa;   

    //初始化套接字DLL   

    if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){   

        printf("套接字初始化失败!");   

        exit(-1);   

    }   

    //创建套接字   

    SOCKET sock;   

    if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){   

        printf("创建套接字失败!");   

        exit(-1);   

    }   

    struct sockaddr_in serverAddress;   

    memset(&serverAddress,0,sizeof(sockaddr_in));   

    serverAddress.sin_family=AF_INET;   

    serverAddress.sin_addr.S_un.S_addr = ip;   

    serverAddress.sin_port = htons(port);   

    //建立和服务器的连接   

    if(connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){   

        printf("建立连接失败!");   

        exit(-1);   

    }   

    //创建从服务器接收数据的线程   

    DWORD threadId;   

    CreateThread(NULL,0,ReceiveThreadProc,&sock,0,&threadId);   

    printf(">");   

    char buf[BUFFER_SIZE];   

    while(1){   

        //从控制台读取一行数据   

        gets(buf);   

        printf(">");   

 

        //发送给服务器   

       if(send(sock,buf,strlen(buf),0)==SOCKET_ERROR){   

            printf("发送数据失败!");   

            exit(-1);   

        }   

 

    }   

    //清理套接字占用的资源   

    WSACleanup();   

    return 0;   

}   

DWORD WINAPI ReceiveThreadProc( LPVOID lpParameter){   

    SOCKET s = *(SOCKET*)lpParameter;   

    char receiveBuf[BUFFER_SIZE];   

    int bytes;   

    while(1){   

        if((bytes=recv(s,receiveBuf,sizeof(receiveBuf),0))==SOCKET_ERROR){   

            printf("接收数据失败!\n");   

            exit(-1);   

        }   

        if(bytes==0){   

            printf("server is down.\n");   

            exit(-1);   

        }   

        receiveBuf[bytes]='\0';   

        //如果用户输入了“bye”   

        if(strcmp(receiveBuf,CMD_BYE)==0){   

            closesocket(s);   

            exit(0);   

        }   

        printf("\n%s\n>",receiveBuf);   

    }   

}  

//Client.cpp

#include <winsock2.h>

#include <stdio.h>

#include <windows.h>

//引入静态链接库

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

//缓冲区大小

#define BUFFER_SIZE  4096

//用来修改用户姓名的命令

const char* CMD_NAME="name";

//用来退出系统的命令

const char* CMD_BYE="bye";

//负责接收数据的线程

DWORD WINAPI ReceiveThreadProc( LPVOID lpParameter);

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

//判断是否输入了IP地址和端口号

if(argc!=3){

printf("Usage: %s IPAddress PortNumber\n",argv[0]);

exit(-1);

}

//把字符串的IP地址转化为u_long

unsigned long ip;

if((ip=inet_addr(argv[1]))==INADDR_NONE){

printf("不合法的IP地址:%s",argv[1]);

exit(-1);

}

//把端口号转化成整数

short port;

if((port = atoi(argv[2]))==0){

printf("端口号有误!");

exit(-1);

}

printf("Connecting to %s:%d......\n",inet_ntoa(*(in_addr*)&ip),port);

WSADATA wsa;

//初始化套接字DLL

if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){

printf("套接字初始化失败!");

exit(-1);

}

//创建套接字

SOCKET sock;

if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){

printf("创建套接字失败!");

exit(-1);

}

struct sockaddr_in serverAddress;

memset(&serverAddress,0,sizeof(sockaddr_in));

serverAddress.sin_family=AF_INET;

serverAddress.sin_addr.S_un.S_addr = ip;

serverAddress.sin_port = htons(port);

//建立和服务器的连接

if(connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){

printf("建立连接失败!");

exit(-1);

}

//创建从服务器接收数据的线程

DWORD threadId;

CreateThread(NULL,0,ReceiveThreadProc,&sock,0,&threadId);

printf(">");

char buf[BUFFER_SIZE];

while(1){

//从控制台读取一行数据

gets(buf);

printf(">");

//发送给服务器

  if(send(sock,buf,strlen(buf),0)==SOCKET_ERROR){

printf("发送数据失败!");

exit(-1);

}

}

//清理套接字占用的资源

WSACleanup();

return 0;

}

DWORD WINAPI ReceiveThreadProc( LPVOID lpParameter){

SOCKET s = *(SOCKET*)lpParameter;

char receiveBuf[BUFFER_SIZE];

int bytes;

while(1){

  if((bytes=recv(s,receiveBuf,sizeof(receiveBuf),0))==SOCKET_ERROR){

printf("接收数据失败!\n");

exit(-1);

}

if(bytes==0){

printf("server is down.\n");

exit(-1);

}

receiveBuf[bytes]='\0';

//如果用户输入了“bye”

if(strcmp(receiveBuf,CMD_BYE)==0){

closesocket(s);

exit(0);

}

printf("\n%s\n>",receiveBuf);

}

 

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/microtong/archive/2009/12/12/4990138.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
飞天江湖 v8.0 正式商业版 新人注册一律10级 新增加“茅厕”功能,可以自己清理粪库 新增加在线游戏类,如:在线台球、象棋等 新增娱乐城,里面有几十种在线游戏。 新增“贴图”新增246张!个个精彩! 增加自动泡点减半积分功能 增加2个功能主页面 增加江湖音乐播放器系统! 增加进入聊天室系统自动发放新人费、金币、银两、属性等! 增加装备维修,丢弃装备 新增功能如下: 股票市场,卡片回收,击鼓鸣冤,挑战怪兽,江湖秀,门派大战,夺宝大赛,会员强练,金币彩票,妇科中心,爱情小筑,宣传奖励,超酷交友,面馆,笑话,礼物,屏蔽,拐骗少男,拐骗少女,解除睡眠,八恒公告,取消身份,站长发级,第二密码,周公解梦 魔法新增功能: 新阴那山,新雁南飞,点石成银,养心大法,招财进宝,妙手回春,回魂口诀,寻找魔器,魔力钻石,生日蛋糕,百变神通,没收魔器,配制宝石,发射子弹,狼牙棒,破天锥,血滴子,绝情刀,抢劫令,字体魔法,移动魔法,按钮魔法 修补七级以上管理员可以设置站长身份漏洞 修补独孤九剑,夫妻合体技,会员绝学,查看状态等可以利用SQL设置站长的漏洞 修补扑克,麻将可以刷钱漏洞 修补掌门利用门派基金骗取道德的漏洞 修补转换市场银币换金币的漏洞 修补情人可以刷金币的漏洞 修补了say.asp的漏洞(最新发现的) 修改了轻功秘笈不能用的问题 修改了江湖玩家改了名字股票丢失的问题 修正了贴图不能用的问题,改换了邀请跳舞 防止了江湖刷屏,系统自动让他去睡大觉 登陆江湖增加显门派,显身份,显IP,显登陆次数 会员片卡增加:童贞卡,归来卡,好人卡,唤醒卡,恢复卡,保级卡,保家卡,破产卡,降级卡 江湖职业增加:男贩,女贩 江湖大事增加:赠送记录,改名记录,解穴记录,斩首记录,卡片记录,法器记录,传授记录,新人费以便各位江湖站长和玩家查询 删除会员武馆,会员修炼,会员充卡,生育小孩,喂养小孩,领养小孩,密码保护等功能 站长登陆口:bh.asp (可以自己改) 管理地址:hc3w_Admin/login1.asp
此版本 和真实视频聊天室 程序完全一样,一般人都分辨不出来是真人的还是虚拟的 程序介绍: 整站大小:43.5 MB 1、本程序是完整版本的虚假视频程序。会员充值多少钱只要扣除少量的手续费后所有的钱都是你的。 2、程序完全高仿正规的视频聊天程序,功能几乎完全一样。用户充值后可以看到**聊天视频。(视频是事先录制的,然后随机播放); 3、省去了聘请主播的成本,只需要寻找**聊天的视频放上去即可,程序自带有大量视频; 4、程序有完善的扣费系统,贝付支付接口,支持时时提现。程序运营不需要人工干预。后台管理方便; 5、程序支付接口已经设置好,只需要进行简单设置即可使用; 6、程序附带简单的后台管理,只可以同时管理会员信息。 贝付支付修改: 把beipay目录下面的index.asp里边PayUrl="http://www.beipay.com/Pay/Pay.jsp?ID=bYLSOjTKCFGD3Rmh"的商户编号bYLSOjTKCFGD3Rmh替换成你的编号就可以了。 下面有一行ReturnUrl="http://www.xxx.com/beipay/receive.asp 这个地址是回调地址,反馈充值成功和失败.把www.xxx.com替换成你的域名 --swf/ 视频播放页面程序 --swf/swf 视频录像存放地址 --Conn.asp 数据库连接程序 --vipreg.htm vipreg.htm 最新引导**注册页面 即日购买源码即送70多个视频文件,在淘宝上这么多视频也能卖很多钱了。 此套源码和有些卖上百的没有任何区别,没有任何限制!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值