📄 y_c.cpp
字号:
// Y_c.cpp: implementation of the Y_c class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Y_c.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
int SendInit();
int SendData(WORD Command,WORD RecvUserID,char *SendBuffer);
int FillAddr(PSOCKADDR_IN psin1,char far *HostName,int UsePort);
DWORD ThreadRecv(LPVOID);
WORD CurrentUserID=0;
CWinThread *m_ThreadRecv;
//****************************************************************
//****************************************************************
//当前在线用户节点的配置
//做一个实时用户链接表。一旦用户登录上来,在此表尾加一个用户节点
//此表不要求排序
struct SOCKUSERDEF SockUserDef;
SOCKADDR_IN psin;
//****************************************************************
DWORD NumBytes;
DWORD Flags =0;
Y_c::Y_c()
{
}
Y_c::~Y_c()
{
}
int SendInit()
{
/*
WSADATA WsaData;
WORD VersionRequested = MAKEWORD(VERSION_MAJOR,VERSION_MAJOR);
int Error = WSAStartup(VersionRequested,&WsaData);
if(Error)
{
AfxMessageBox("不能启动套接字");
}
*/
FILE *Read_fp;
char ComName[20];
Read_fp=fopen("Y_init.inf","rb");
if(Read_fp==NULL)
{
gethostname(ComName,100);
}
else
{
fread(ComName,sizeof(char)*20,1,Read_fp);
for(int i=0;i<19;i++)
{
if(ComName[i]==13)
{
ComName[i]='\0';
break;
}
}
}
//lResult = WSAStartup(0x0101,&ws);
SockUserDef.Sock = socket(AF_INET,SOCK_STREAM,0);
psin.sin_family = AF_INET;
psin.sin_port = htons(3490);
psin.sin_addr.s_addr = inet_addr("10.142.40.1"); //
if((SockUserDef.Sock = socket(AF_INET,SOCK_STREAM,0))== INVALID_SOCKET)
{
// ERROR
AfxMessageBox("创建套接字出错");
return 0;
}
int pp=connect(SockUserDef.Sock,(struct sockaddr *)&psin, sizeof(psin));
if (pp!=0)
{
AfxMessageBox("套接字连接错错误或超时");
return 0;
}
SockUserDef.Connection=1;
m_ThreadRecv =
AfxBeginThread((AFX_THREADPROC)ThreadRecv,NULL,THREAD_PRIORITY_NORMAL);
SendData(COMMAND1,0,NULL);//向服务器登录
return 0;
}
int SendData(WORD Command,WORD RecvUserID,char *SendBuffer)
{
// char SendChBuffer[1029];
// SendInit();
/*
#define COMMAND1 101//用户登录,向登录用户及数据库中所有好友发出此用户上线的消息
#define COMMAND2 102//用户离线,向登录用户及数据库中好友发出此用户离线的消息,
//并取消此套接字的连接和相关信息
#define COMMAND3 103//用户要求将某ID加为好友
#define COMMAND4 104//用户普通传送文本
#define COMMAND5 105//当前在线的好友名单
*/
struct USERHEADDEF *tempHead;
char *Buffer=
(char *)&SockUserDef.SendChBuffer[sizeof(struct USERHEADDEF)];
if(SendBuffer!=NULL)
strcpy(Buffer,SendBuffer);
tempHead=(struct USERHEADDEF *)SockUserDef.SendChBuffer;
switch(Command)
{
case COMMAND1://上线
tempHead->Optn =COMMAND1;
tempHead->SendUserID =CurrentUserID;
tempHead->RecvUserID =0;
tempHead->Len =0;
break;
case COMMAND2://离线
break;
case COMMAND3:
break;
case COMMAND4://传送普通文本
tempHead->Optn =COMMAND4;
tempHead->SendUserID =CurrentUserID;
tempHead->RecvUserID =RecvUserID;
tempHead->Len =strlen(Buffer)+1;
break;
default:
break;
}
int pp = send (SockUserDef.Sock,SockUserDef.SendChBuffer,tempHead->Len+sizeof(struct USERHEADDEF),0);
if (pp == SOCKET_ERROR)
{
AfxMessageBox("发送错误");
}
tempHead->Len=0;
return 0;
}
DWORD ThreadRecv(LPVOID)
{
int tempIndex;
char *CBuffer;
WORD *WBuffer;
while(1)
{
if(SockUserDef.Connection==1)
{
int errorflag=recv(SockUserDef.Sock,(char *)SockUserDef.RecvChBuffer,256,0);
if(errorflag==SOCKET_ERROR)
{
int Error = WSAGetLastError();
switch(Error)
{
case WSAENETDOWN:
AfxMessageBox("WSAENETDOWN");
break;
case WSAENOTCONN:
AfxMessageBox("WSAENOTCONN");
break;
case WSAENETRESET:
SockUserDef.Connection=0;
break;
case WSAECONNRESET:
SockUserDef.Connection=0;
break;
case WSAEWOULDBLOCK:
break;
default:
break;
}
}
if(errorflag>0)
{
struct USERHEADDEF *tempHead;
tempHead=(struct USERHEADDEF *)SockUserDef.RecvChBuffer;
switch(tempHead->Optn )
{
case COMMAND2://好友离线
WBuffer = (WORD *)&SockUserDef.RecvChBuffer[sizeof(struct USERHEADDEF)];
for(tempIndex=0;tempIndex<MAXFRIENDSIZE;tempIndex++)
{
if(SockUserDef.Friend[tempIndex].Friend ==*WBuffer)
{
SockUserDef.Friend[tempIndex].OnOrDown =0;
}
}
break;
case COMMAND4://普通文本
CBuffer=
(char *)&SockUserDef.RecvChBuffer[sizeof(struct USERHEADDEF)];
if(tempHead->Len )
{
// MessageBox(AfxGetApp()->m_pMainWnd->m_hWnd,(LPCTSTR)CBuffer,"ok",MB_OK);
tempHead->Len =0;
for(tempIndex=0;tempIndex<MAXFRIENDSIZE;tempIndex++)
{
if(SockUserDef.Friend[tempIndex].Friend ==tempHead->SendUserID)
{
//如果有文本过来,将文本存入好友的缓存中
SockUserDef.Friend[tempIndex].RcvBuffer.Add ((LPCTSTR)CBuffer);
break;
}
}
}
break;
case COMMAND5://在线的好友(刚上线,或好友上线时接收到)
WBuffer = (WORD *)&SockUserDef.RecvChBuffer[sizeof(struct USERHEADDEF)];
for(tempIndex=0;tempIndex<tempHead->Len;tempIndex++)
{
for(int j=0;j<MAXFRIENDSIZE;j++)
{
if(SockUserDef.Friend[j].Friend ==*WBuffer)
{
SockUserDef.Friend[j].OnOrDown =1;
}
}
*WBuffer++;
}
break;
}
}
}
Sleep(5);
}
}
//888888888888888888888888888888888888888888888888888888888888888888888888
//888888888888888888888888888888888888888888888888888888888888888888888888
int FillAddr(PSOCKADDR_IN psin1,char far *HostName,int UsePort)
{
PHOSTENT phe;
psin1->sin_family = AF_INET;
phe = gethostbyname((LPCTSTR)HostName);
if (phe == NULL)
{
// MessageBox(0,"HOSTB", "gethostbyname() failed.", MB_OK);
return -1;
}
memcpy((char FAR *)&(psin1->sin_addr), phe->h_addr_list[0],
phe->h_length);
psin1->sin_port=htons(UsePort);
return 0;
}
//888888888888888888888888888888888888888888888888888888888888888888888888
//888888888888888888888888888888888888888888888888888888888888888888888888
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -