?? 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 + -