南工程聊天室客户端源码
南京工程学院通信工程学院的《Windows网络编程》一课的课程设计源码,聊天室的搭构需要服务器和客户端。服务器源码请看上一篇博文,都有贴出。备注也很详细,可以参考一下。不过作为聊天室功能也很多的,我这里贴出的代码功能实现的并不全面。如果有同学对此作出改进,希望可以交流一下。
MyMsg.h
#pragma once
/************************************************************
* 文件名:MyMsg.h
* 描述: 服务器和客户端共用的头文件,消息定义
*************************************************************/
#ifndef _MYMSG_H_
#define _MYMSG_H_
enum {
LOGIN_MSG, //登录
LOGIN_MSG_RES, //登录响应
QUERY_FQQ, //查询单个好友QQ
QUERY_FQQ_RES, //查询单个好友QQ的响应
TALK_MSG, //聊天
REQUEST_ALL_FRD, //请求所有qq好友信息
APPLY_ALL_FRD //应答所有qq好友信息
};
struct LoginMsg {
unsigned char id; //消息编号
char qq[6]; //登录ID号
};
struct LoginMsgResponse {
unsigned char id; //消息编号
unsigned char isOK;
char reason[100]; //如果失败,则在此写入失败原因
};
struct FriendQqMsg {
unsigned char id; //消息编号
char qq[6];
};
struct FriendQqMsgResponse {
unsigned char id; //消息编号
unsigned char isOK;
};
struct TalkMsg {
unsigned char id; //消息编号
char qq[6];
char fqq[6];
char info[200];
};
struct RequestAllFriend {
unsigned char id; //消息编号
};
struct AllFriendMsg {
unsigned char id; //消息编号
char qq[6];
};
#endif
MyTcp.cpp
/************************************************************
* 文件名:MyTCP.cpp
* 描述: TCP/IP通信socket封装
*************************************************************/
#include <stdio.h>
#include <WinSock2.h>
#include "MyTools.h"
#pragma comment (lib, "ws2_32.lib")
#define PORT 5001
int ls; //侦听套接字
int flag;//记录服务器或是客户端的标志
/* 描述: 初始化服务器或客户端, 该函数在使用中必需首先调用,客户端和服务器 */
int initSock(int IsServer)
{
WSADATA data;
if (WSAStartup(1, &data) <0)
printMsgExit("call WSAStartup() failure!");
ls = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ls < 0)
printMsgExit("创建套接字失败!");
flag = IsServer;
if (IsServer != 0)
{//服务器
struct sockaddr_in servAddr;
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(PORT);
if (bind(ls, (struct sockaddr *)&servAddr, sizeof(servAddr))<0) {
printMsg("bind套接字失败!\n");
return -1;
}
if (listen(ls, 10)<0) {
printMsg("listen套接字失败!\n");
return -1;
}
}
return 0;
}
/* 描述: 仅用于客户端, 连接服务器 */
int tcpConnect(const char *serverIP, unsigned short port)
{
struct sockaddr_in servAddr;
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(serverIP);
servAddr.sin_port = htons(port);
if (connect(ls, (struct sockaddr *)&servAddr, sizeof(servAddr))<0)
{
printMsgExit("连接服务器失败!\n");
}
return ls;
}
/* 描述: 发送数据 */
int tcpSend(