void OnServerOpen() //開啟服務器功能
{
WSADATA wsaData;
int iErrorCode;
char chInfo[64];
if (WSAStartup(WINSOCK_VERSION, &wsaData)) //調用Windows Sockets DLL
{ MessageBeep(MB_ICONSTOP);
MessageBox("Winsock無法初始化!", AfxGetAppName(), MB_OKMB_ICONSTOP);
WSACleanup();
return; }
else
WSACleanup();
if (gethostname(chInfo, sizeof(chInfo)))
{ ReportWinsockErr("/n無法獲取主機!/n ");
return; }
CString csWinsockID = "/n==>>服務器功能開啟在端口:No. ";
csWinsockID += itoa(m_pDoc->m_nServerPort, chInfo, 10);
csWinsockID += "/n";
PRintString(csWinsockID); //在程序視圖顯示提示信息的函數,讀者可自行創建
m_pDoc->m_hServerSocket=socket(PF_INET, SOCK_STREAM, DEFAULT_PROTOCOL);
//創建服務器端Socket,類型為SOCK_STREAM,面向連接的通信
if (m_pDoc->m_hServerSocket == INVALID_SOCKET)
{ ReportWinsockErr("無法創建服務器socket!");
return;}
m_pDoc->m_sockServerAddr.sin_family = AF_INET;
m_pDoc->m_sockServerAddr.sin_addr.s_addr = INADDR_ANY;
m_pDoc->m_sockServerAddr.sin_port = htons(m_pDoc->m_nServerPort);
if (bind(m_pDoc->m_hServerSocket, (LPSOCKADDR)&m_pDoc->m_sockServerAddr,
sizeof(m_pDoc->m_sockServerAddr)) == SOCKET_ERROR) //與選定的端口綁定
{ReportWinsockErr("無法綁定服務器socket!");
return;}
iErrorCode=WSAAsyncSelect(m_pDoc->m_hServerSocket,m_hWnd,
WM_SERVER_ACCEPT, FD_ACCEPT);
//設定服務器相應的網絡事件為FD_ACCEPT,即連接請求,
// 產生相應傳遞給窗口的消息為WM_SERVER_ACCEPT
if (iErrorCode == SOCKET_ERROR)
{ ReportWinsockErr("WSAAsyncSelect設定失敗!");
return;}
if (listen(m_pDoc->m_hServerSocket, QUEUE_SIZE) == SOCKET_ERROR) //開始監聽客戶連接請求
{ReportWinsockErr("服務器socket監聽失敗!");
m_pParentMenu->EnableMenuItem(ID_SERVER_OPEN, MF_ENABLED);
return;}
m_bServerIsOpen = TRUE; //監視服務器是否打開的變量
return;
}
LRESULT OnClientRead(WPARAM wParam, LPARAM lParam)
{
int iRead;
int iBufferLength;
int iEnd;
int iRemainSpace;
char chInBuffer[1024];
int i;
for(i=0;(i
//MAXClient是服務器可響應連接的最大數目
{}
if(i==MAXClient) return 0L;
iBufferLength = iRemainSpace = sizeof(chInBuffer);
iEnd = 0;
iRemainSpace -= iEnd;
iBytesRead = recv(m_aClientSocket[i], (LPSTR)(chInBuffer+iEnd), iSpaceRemaining, NO_FLAGS);
//用可控緩沖接收函數recv()來接收字符
iEnd+=iRead;
if (iBytesRead == SOCKET_ERROR)
ReportWinsockErr("recv出錯!");
chInBuffer[iEnd] = '/0';
if (lstrlen(chInBuffer) != 0)
{PrintString(chInBuffer); //服務器端文字顯示
OnServerBroadcast(chInBuffer); //自己編寫的函數,向所有連接的客戶廣播這個客戶的聊天文字
}
return(0L);
}
void OnSocketConnect()
{ WSADATA wsaData;
DWord dwIPAddr;
SOCKADDR_IN sockAddr;
if(WSAStartup(WINSOCK_VERSION,&wsaData)) //調用Windows Sockets DLL
{MessageBox("Winsock無法初始化!",NULL,MB_OK);
return;
}
m_hSocket=socket(PF_INET,SOCK_STREAM,0); //創建面向連接的socket
sockAddr.sin_family=AF_INET; //使用TCP/IP協議
sockAddr.sin_port=m_iPort; //客戶端指定的IP地址
sockAddr.sin_addr.S_un.S_addr=dwIPAddr;
int nConnect=connect(m_hSocket,(LPSOCKADDR)&sockAddr,sizeof(sockAddr)); //請求連接
if(nConnect)
ReportWinsockErr("連接失敗!");
else
MessageBox("連接成功!",NULL,MB_OK);
int iErrorCode=WSAAsyncSelect(m_hSocket,m_hWnd,WM_SOCKET_READ,FD_READ);
//指定響應的事件,為服務器發送來字符
if(iErrorCode==SOCKET_ERROR)
MessageBox("WSAAsyncSelect設定失敗!");
}
新聞熱點
疑難解答