有阻塞的程序,部分,不好意思
=============================================server
void CSeverClientDlg::OnButton_ThreadOn()
{
UpdateData(true);//刷新端口
if(m_edit_Port=="")
{
AfxMessageBox("请输入端口");
}
else
{
port=atoi(m_edit_Port);
deal();
}
}
void CSeverClientDlg::deal()
{
CString linkPort="["+m_edit_Port+"]";
CString nowPing;
if(IsListening==true)
{
AfxMessageBox("已经在监听");
}
else
{
ServerSocket=socket(AF_INET,SOCK_STREAM,0);
ClientSocket=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in ServerAddr;
if( ClientSocket == -1 )
{
AfxMessageBox( "accept调用失败!\n" );
exit( 0 );
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(port);//监视的端口号2008
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);//本地IP
if( (bind(ServerSocket,( struct sockaddr *)&ServerAddr,sizeof(ServerAddr))) <0)
{
AfxMessageBox("bind failed!");
}
if (listen(ServerSocket,5) < 0)
{
AfxMessageBox("listen error");
}
if(WSAAsyncSelect(ServerSocket,m_hWnd,WM_MY_MSG,FD_WRITE|FD_CLOSE|FD_READ|FD_ACCEPT)==0)
AfxMessageBox("已经开始监听端口 :"+linkPort);
nowPing="打开端口并开始监听\r\n";
m_edit_Ping+=nowPing;
UpdateData(false);
IsListening=true;
}//if
}
void CSeverClientDlg::OnButton_Cut_Listen()
{
if(IsListening==false)
{
AfxMessageBox("目前没有监听");
}
else
{
IsListening=false;
m_edit_Ping+="已经断开监听了\r\n";
UpdateData(false);
send(ClientSocket,"2",strlen("2")+1,0);
closesocket(ServerSocket);
closesocket(ClientSocket);
}
}
LRESULT CSeverClientDlg::OnMyMessage(WPARAM wParam,LPARAM lParam)
{
int nLength;
int numbytes;
char buf[ MAXDATASIZE ];
CString str,str2;
CEdit * pEdit;
CString rPeerAddress;
CString cport;
//switch
switch(LOWORD(lParam))
{
case FD_READ:
numbytes = recv( ClientSocket, buf, MAXDATASIZE, 0 );//recv接收
if( numbytes == -1 )
{
AfxMessageBox( "recv失败!" );
WSACleanup( );
exit( 0 );
}
buf[ numbytes ] = '\0';
str.Format("%s",buf);
str+="\r\n";
pEdit=(CEdit*)GetDlgItem(IDC_EDIT2);
pEdit->GetWindowText(str2);
str2+=str;;
pEdit->SetWindowText(str2);
pEdit->SetSel(str2.GetLength(), str2.GetLength());
break;
case FD_WRITE:
break;
case FD_ACCEPT:
{
struct sockaddr_in ClientAddr;
int sin_size = sizeof( struct sockaddr_in );
ClientSocket = accept( ServerSocket, ( struct sockaddr * )&ClientAddr, &sin_size );
m_edit_Ping+="________________________有客户端连接上_________________________\r\n";
rPeerAddress=inet_ntoa(ClientAddr.sin_addr);
cport.Format("%u",ntohs(ClientAddr.sin_port));
m_edit_Ping+="客户端的IP为 :"+rPeerAddress;
m_edit_Ping+="客户端端口为 :"+cport+"\r\n";
UpdateData(false);
send(ClientSocket,"1",strlen("1")+1,0);
break;
}
}//switch
return 0;
}
======================================================client
void CClientSocketDlg::OnBUTTONRequest()
{
CString str;
if(IsRequest==true)
{
AfxMessageBox("已经连接了.");
}
else
{
UpdateData(true);
if(m_edit_IP=="")
{
AfxMessageBox("请输入IP,在IP框里面.");
}
else
{
if(m_edit_Port=="")
{
AfxMessageBox("请输入端口,在端口框输入.");
}
else
{
IsRequest=true;
IP =m_edit_IP;
Port=atoi(m_edit_Port);
deal();
}
}
}//if(isR......)
}
void CClientSocketDlg::deal()
{
// SOCKET ClientSocket;
ClientSocket=socket(PF_INET,SOCK_STREAM,0);
struct sockaddr_in ServerAddr;
// int numbytes;
// char buf[ MAXDATASIZE ];
CString str;
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = inet_addr(IP);
memset( &( ServerAddr.sin_zero ), 0, sizeof(ServerAddr.sin_zero ) );
if(ClientSocket<0)
{
AfxMessageBox("Client failed!");
}
if( connect( ClientSocket, (struct sockaddr *) & ServerAddr, sizeof(struct sockaddr)) == -1 )
{
AfxMessageBox("请查看服务器端端口是否打开");
WSACleanup( );
exit( 0 );
}
else
{
m_edit_TrueOrFalse="连接成功!";
UpdateData(false);
}
WSAAsyncSelect(ClientSocket,m_hWnd,WM_MESSAGE1,FD_WRITE|FD_CLOSE|FD_READ|FD_ACCEPT);
// closesocket( ClientSocket );
// WSACleanup( );
}
void CClientSocketDlg::OnBUTTONCutDown()
{
if(closesocket(ClientSocket)==0)
{
m_edit_TrueOrFalse="已经断开连接";
IsRequest=false;
UpdateData(false);
}
}
void CClientSocketDlg::OnBUTTONSend()
{
CString str;
UpdateData(true);
if(m_edit_Send=="")
{
AfxMessageBox("内容不为空.");
}
else
{
UpdateData(true);
send(ClientSocket,m_edit_Send,strlen(m_edit_Send)+1,0);
m_edit_Send="";
UpdateData(false);
}
}
LRESULT CClientSocketDlg::DoMyMessage(WPARAM wParam,LPARAM lParam)
{
int numbytes;
char buf[ MAXDATASIZE ];
CString str;
int i;
switch(LOWORD(lParam))
{
case FD_READ:
numbytes = recv( ClientSocket, buf, MAXDATASIZE, 0 );//recv接收
if( numbytes == -1 )
{
AfxMessageBox( "recv失败!" );
WSACleanup( );
exit( 0 );
}
buf[ numbytes ] = '\0';
if(CString(buf)==CString("1"))
{
m_edit_Accept="谢谢你的连接";
}
else
if(CString(buf)==CString("2"))
{
m_edit_Accept="服务器端已经断开连接,请不要在此时进行连接,否则程序自动退出";
IsRequest=false;
closesocket(ClientSocket);
}
UpdateData(false);
break;
case FD_WRITE:break;
case FD_ACCEPT:break;
default: break;
}
return 0;
}
评论