socket()-> bind()-> listen-> accept()-> recv()/send()-> closesocket()
socket()-> connect()-> send()/recv()-> closesocket()
sock=socket(AF_INET,SOCK_STREAM,0);
sockin.sin_family=AF_INET;
sockin.sin_addr.s_addr=0;
sockin.sin_port=htons(USERPORT);
bind(sock,(LPSOCKADDR)&sockin,sizeof(sockin)));
//連接請求隊列長度為1,即只答應有一個請求,若有多個請求,
//則出現錯誤,給出錯誤代碼WSAECONNREFUSED。
listen(sock,1);
//開啟線程避免主程序的阻塞
AfxBeginThread(Server,NULL);
……
UINT Server(LPVOID lpVoid)
{
……
int nLen=sizeof(SOCKADDR);
pView-> newskt=accept(pView-> sock,(LPSOCKADDR)& pView-> sockin,(LPINT)& nLen);
……
WSAAsyncSelect(pView-> newskt,pView-> m_hWnd,WM_SOCKET_MSG,FD_READFD_CLOSE);
return 1;
}
void CNetServerView::OnSocket(WPARAM wParam,LPARAM lParam)
{
int iReadLen=0;
int message=lParam & 0x0000FFFF;
switch(message)
{
case FD_READ://讀事件發生。此時有字符到達,需要進行接收處理
char cDataBuffer[MTU*10];
//通過套接字接收信息
iReadLen = recv(newskt,cDataBuffer,MTU*10,0);
//將信息保存到文件
if(!file.Open("ServerFile.txt",CFile::modeReadWrite))
file.Open("E:ServerFile.txt",CFile::modeCreateCFile::modeReadWrite);
file.SeekToEnd();
file.Write(cDataBuffer,iReadLen);
file.Close();
break;
case FD_CLOSE://網絡斷開事件發生。此時客戶機關閉或退出。
……//進行相應的處理
break;
default:
break;
}
}
//{{AFX_MSG(CNetServerView)
//}}AFX_MSG
void OnSocket(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CNetServerView, CView)
//{{AFX_MSG_MAP(CNetServerView)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_SOCKET_MSG,OnSocket)
END_MESSAGE_MAP()
WSAAsyncSelect(s,hwnd,wMsg1,FD_READ);
WSAAsyncSelect(s,hwnd,wMsg2,FD_CLOSE);
sockin.sin_family=AF_INET; //地址族
sockin.sin_addr.S_un.S_addr=IPaddr; //指定服務器的IP地址
sockin.sin_port=m_Port; //指定連接的端口號
int nConnect=connect(sock,(LPSOCKADDR)&sockin,sizeof(sockin));
新聞熱點
疑難解答