第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

請問我該怎么和單獨(dú)的一個(gè)客戶機(jī)通信啊?

請問我該怎么和單獨(dú)的一個(gè)客戶機(jī)通信???

嚕嚕噠 2023-03-20 16:12:34
服務(wù)端監(jiān)聽,一堆客戶端連接, 看了點(diǎn)教程,只會在客戶端連接的時(shí)候通信,其他的時(shí)候要怎么通信啊?
查看完整描述

1 回答

?
拉莫斯之舞

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊

初始化socket
首先需要調(diào)用AfxSocketInit()函數(shù)來初始化我們的socket環(huán)境。
為了初始化sockets,我們需要調(diào)用AfxSocketInit()函數(shù)。它通常是在MFC中的InitInstance()函數(shù)中被調(diào)用的。如果我們用程序向?qū)韯?chuàng)建socket程序的話,查看“use Windows Sockets”這個(gè)選項(xiàng),然后選中它。它將會自動的為我們創(chuàng)建這個(gè)步驟了。(如果我們沒有選中這個(gè)選項(xiàng)的話,我們也可以手動添加這些代碼的。)這個(gè)函數(shù)的返回值顯示這個(gè)函數(shù)的調(diào)用成功或失敗。
BOOL CServerApp::InitInstance()
{....
if( AfxSocketInit() == FALSE)

AfxMessageBox("Sockets Could Not Be Initialized"); 
return FALSE; 
}
...
}
創(chuàng)建Server Sockets
為了創(chuàng)建一個(gè)Server Socket,我們需要聲明一個(gè)CAyncSocket的變量或者我們自己定制的一個(gè)從AyncSocket或是Cscket繼承來的類的類型的變量。然后調(diào)用Create()函數(shù),同時(shí)指定監(jiān)聽的端口。這個(gè)函數(shù)的返回值顯示這個(gè)函數(shù)的調(diào)用成功或失敗。
UpdateData(TRUE);
m_sListener.Create(m_port);
if(m_sListener.Listen()==FALSE) 

AfxMessageBox("Unable to Listen on that port,please try another port"); 
m_sListener.Close(); 
return; 
}
創(chuàng)建Client Sockets
為了創(chuàng)建Client socket類,我們需要聲明一個(gè)CAyncSocket的變量或者我們自己定制的一個(gè)從AyncSocket或是Cscket繼承來的類的類型的變量。然后調(diào)用Create()函數(shù),同時(shí)指定監(jiān)聽的端口。這個(gè)函數(shù)的返回值顯示這個(gè)函數(shù)的調(diào)用成功或失敗。
m_sConnected.Create();
m_sConnected.Connect("server ip",port);
監(jiān)聽客戶端的連接
創(chuàng)建了server socket以后,我們要進(jìn)行監(jiān)聽。調(diào)用Listen()函數(shù)。這個(gè)函數(shù)的返回值顯示這個(gè)函數(shù)的調(diào)用成功或失敗。
if( m_sListener.Listen()== FALSE) 

AfxMessageBox("Unable to Listen on that port,please try another port"); 
m_sListener.Close(); 
return;
}
接受連接
連接請求要被接受accept,是用另外的socket,不是正在監(jiān)聽的socket。請參看代碼。
void CXXXDlg::OnAccept()
{
CString strIP; 
UINT port; 
if(m_sListener.Accept(m_sConnected)) 
{
m_sConnected.GetSockName(strIP,port); //應(yīng)該是GetPeerName,獲取對方的IP和port
m_status="Client Connected,IP :"+ strIP; 
m_sConnected.Send("Connected To Server",strlen("Connected To Server"));  
UpdateData(FALSE); 
}
else 

AfxMessageBox("Cannoot Accept Connection"); 

}
發(fā)送數(shù)據(jù)
數(shù)據(jù)放在一個(gè)buffer中或是結(jié)構(gòu)體中,調(diào)用send()函數(shù)發(fā)送。
m_sConnected.Send(pBuf,iLen);
接受數(shù)據(jù)
調(diào)用receive()接受數(shù)據(jù)。
void CXXXrDlg::OnReceive() 

char *pBuf =new char [1025]; 
CString strData; 
int iLen;
iLen=m_sConnected.Receive(pBuf,1024);  
if(iLen == SOCKET_ERROR)  
{
AfxMessageBox("Could not Recieve");  
}  
else  

pBuf[iLen]=NULL;
strData=pBuf;
m_recieveddata.Insert(m_recieveddata.GetLength(),strData); 
//display in server  
UpdateData(FALSE); 
m_sConnected.Send(pBuf,iLen); //send the data back to the Client  
delete pBuf;  

}
關(guān)閉連接
m_sConnected.ShutDown(0); 停止發(fā)送數(shù)據(jù)
m_sConnected.ShutDown(1); 停止接受數(shù)據(jù)
m_sConnected.ShutDown(2); 停止發(fā)送接受數(shù)據(jù)
m_sConnected.Close();
編寫自己的socket類
在class view中選擇添加一個(gè)新類,設(shè)置它的基類為CAsyncSocket,在類向?qū)У膸椭绿砑尤缦碌囊恍┖瘮?shù)。
class MySocket : public CAsyncSocket
{ // Attributes 
public: 
// Operations
public: 
MySocket(); 
virtual ~MySocket(); 
// Overrides 
public: 
void SetParentDlg(CDialog *pDlg);// ClassWizard generated virtual function overrides 
//{{AFX_VIRTUAL(MySocket) 
public: 
virtual void OnAccept(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnOutOfBandData(int nErrorCode);
virtual void OnReceive(int nErrorCode); 
virtual void OnSend(int nErrorCode); 
//}}AFX_VIRTUAL // Generated message map functions 
//{{AFX_MSG(MySocket) 
// NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG 
protected: 
private:
CDialog * m_pDlg; 
};
設(shè)置“Parent Dialog”
調(diào)用這個(gè)socket類的SetParentDlg函數(shù),保證當(dāng)socket事件發(fā)生的時(shí)候這個(gè)窗體能接收到。
m_sListener.SetParentDlg(this); 
m_sConnected.SetParentDlg(this);
建立Socket 事件和窗體成員函數(shù)之間的聯(lián)系
在這個(gè)窗體類中添加一些函數(shù),比如void OnReceive(); void OnClose(); void OnAccept(); void OnConnect()等,它們會在我們編寫的的socket類中調(diào)用到。
void MySocket::OnAccept(int nErrorCode) 

// TODO: Add your specialized code here and/or call the base class 
if(nErrorCode==0) 

((CServerDlg*)m_pDlg)->OnAccept(); 
}
CAsyncSocket::OnAccept(nErrorCode); 
}

 


查看完整回答
反對 回復(fù) 2023-03-22
  • 1 回答
  • 0 關(guān)注
  • 124 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號