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(unsigned int sock, const char *sendBuf, int sendBufLen)
- {
- int len = send(sock, sendBuf, sendBufLen, 0);
- return len;
- }
- /* 描述: 接收数据 */
- int tcpRecv(unsigned int sock, char *recvBuf, int recvBufLen)
- {
- int len = recv(sock, recvBuf, recvBufLen, 0);
- return len;
- }
- void tcpClose(unsigned int sock)
- {
- closesocket(sock);
- WSACleanup();
- }
- #pragma once
- /************************************************************
- * 文件名:MyTCP.h
- * 描述: TCP通信头文件
- *************************************************************/
- #ifndef _MYTCP_H_
- #define _MYTCP_H_
- int initSock(int IsServer);
- int tcpConnect(const char *serverIP, unsigned short port);
- int tcpAccept();
- int tcpSend(unsigned int sock, const char *sendBuf, int sendBufLen);
- int tcpRecv(unsigned int sock, char *recvBuf, int recvBufLen);
- void tcpClose(unsigned int sock);
- #endif
MyTools.cpp
- /************************************************************
- * 文件名:MyTools.cpp
- * 描述: 共用的文件,工具函数定义
- *************************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include "MyTools.h"
- extern int flag;
- void printMsg(const char * msg) {
- if (flag)
- printf("\t【南工服务器豪华版】%s", msg);
- else
- printf("\t【南工客户端豪华版】%s", msg);
- }
- void printInt(int value) {
- if (flag)
- printf("\t【南工服务器豪华版】%d", value);
- else
- printf("\t【南工客户端豪华版】%d", value);
- }
- void printMsgExit(const char * msg) {
- printMsg(msg);
- exit(0);
- }
- void printIntExit(int value) {
- printInt(value);
- exit(0);
- }