TCPAPI网络通信(一个服务器对一个…
2015-04-28 16:38
357 查看
服务器:
BOOL
CWinSockSeverApp::InitInstance()
{
//extra code
VERIFY(1==InitSkinMagicLib(AfxGetInstanceHandle(),NULL,NULL,NULL));
VERIFY(1==LoadSkinFile("corona.smf"));
}
在WinSockSeverDlg.h中添加变量:
public:
int GetCount();
void SendToAll(SOCKET s,char *buff);
SOCKET m_sock;
~CWinSockSeverDlg();
SOCKET msgsock[50];
int addlen;
sockaddr_in serv;
int count;
在WinSockSeverDlg.cpp
BOOL
CWinSockSeverDlg::OnInitDialog()
{
//extra code
SetWindowSkin(
m_hWnd
,
"Dialog"
);
SetDialogSkin("Dialog");
// TODO: Add extra initialization here
count=1;
m_listInfo.InsertString(0,"消息");
for(int i=0;i<50;i++)
msgsock[i]=NULL;
serv.sin_addr.s_addr=htonl(INADDR_ANY);
serv.sin_family=AF_INET;
serv.sin_port=5000;
addlen=sizeof(serv);
m_button.EnableWindow(FALSE);
m_sock=socket(AF_INET,SOCK_STREAM,0);
if(bind(m_sock,(sockaddr*)&serv,addlen))
{
AfxMessageBox("绑定错误");
}
else
{
AfxMessageBox("服务器创建成功");
listen(m_sock,5);
AfxBeginThread(&Thread,0);
}
}
void
CWinSockSeverDlg::OnButtonSend()
{
char buff[100];
m_edit.GetWindowText(buff,99);
m_edit.SetWindowText(" ");
CString str=buff;
str="服务器:"+str;
m_listInfo.InsertString(count++,str);
for(int i=0;i<50;i++)
{
if(msgsock[i]!=NULL)
{
send(msgsock[i],buff,100,0);
}
}
}
UINT Thread(LPVOID
p)
{
char buff[100];
int s=1,msgcount,loop=1,flag=0;
CWinSockSeverDlg *dlg=(
CWinSockSeverDlg *)Afx
4000
GetApp()->GetMainWnd();
msgcount=dlg->GetCount();
if(msgcount==-1)
{
loop=0;
}
if(loop)
{
s=1;
dlg->msgsock[msgcount]=accept(dlg->m_sock,(sockaddr
*)&(dlg->serv),&(dlg->addlen));
if(dlg->msgsock[msgcount]==INVALID_SOCKET)
{
dlg->m_edit.SetWindowText("Error
accept");
}
else
{
AfxBeginThread(Thread,0);
dlg->SetForegroundWindow();
dlg->m_listInfo.InsertString(dlg->count++,"连接成功");
dlg->m_listInfo.InsertString(dlg->count++,inet_ntoa(dlg->serv.sin_addr));
dlg->m_button.EnableWindow(TRUE);
while(SOCKET_ERROR!=s)
{
s=recv(dlg->msgsock[msgcount],buff,100,0);
if(SOCKET_ERROR!=s)
{buff[s]='\0';
CString
str=buff;
str="客户机:"+str;
dlg->SetForegroundWindow();
dlg->m_listInfo.InsertString(dlg->count++,str);
// dlg->SendToAll(dlg->msgsock[msgcount],buff);
}
}
send(dlg->msgsock[msgcount],"Disconnected",100,0);
dlg->m_listInfo.InsertString(dlg->count++,"Disconnected");
for(int
i=0;i<50;i++)
if(dlg->msgsock[i]!=NULL)
flag=1;
if(flag!=1)
dlg->m_button.EnableWindow(FALSE);
closesocket(dlg->msgsock[msgcount]);
}
}
AfxEndThread(0);
return 0;
}
int
CWinSockSeverDlg::GetCount()
{
for(int i=0;i<50;i++)
{
if(msgsock[i]==NULL)
return
i;
}
return -1;
}
CWinSockSeverDlg::~CWinSockSeverDlg()
{
for(int i=0;i<50;i++)
if(msgsock[i]!=NULL)
send(msgsock[i],"Disconnected",100,0);
}
用SkinMagic做对话框皮肤:
将SkinMagiclib.h,corona.smf
,SkinMagicTrial.lib,SkinMagicTrial.dll放在调试目录下
在工程-》设置->general->MFC
Foundation class选静态链接
客户机:
BOOL
CWinSockClientApp::InitInstance()
{
//extra
code
VERIFY( 1 ==
InitSkinMagicLib(AfxGetInstanceHandle(), NULL , NULL, NULL
));
VERIFY(1==LoadSkinFile("corona.smf"));
}
在WinSockClientDlg.h中
public:
~CWinSockClientDlg();
int count;
sockaddr_in cli;
SOCKET clisock;
WinSockClientDlg.cpp:
BOOL
CWinSockClientDlg::OnInitDialog()
{
// TODO: Add extra initialization
here
SetWindowSkin(
m_hWnd
,
"Dialog"
);
SetDialogSkin("Dialog");
m_editMessage.SetLimitText(99);
m_listInfo.InsertString(0,"消息");
m_buttonSend.EnableWindow(FALSE);
m_editIP.SetWindowText("127.0.0.1");
count=1;
return TRUE;
}
void
CWinSockClientDlg::OnButtonConnect()
{
char ipaddress[35];
m_editIP.GetWindowText(ipaddress,30);
cli.sin_addr .s_addr=inet_addr(ipaddress);
cli.sin_family =AF_INET;
cli.sin_port=5000;
clisock=socket(AF_INET,SOCK_STREAM,0);
AfxBeginThread(Thread,0);
}
void
CWinSockClientDlg::OnButtonDisconnect()
{
closesocket(clisock);
}
void
CWinSockClientDlg::OnButtonSend()
{
char buff[100];
m_editMessage.GetWindowText(buff,99);
m_editMessage.SetWindowText(" ");
CString str=buff;
str="客户机:"+str;
m_listInfo.InsertString(count++,str);
send(clisock,buff,100,0);
}
UINT Thread(LPVOID)
{
char buff[100];
int s=1,addcount=0;
CWinSockClientDlg *dlg=(CWinSockClientDlg
*)AfxGetApp()->GetMainWnd();
dlg->m_buttonConnect.EnableWindow(FALSE);
dlg->m_buttonDisConnect.EnableWindow(TRUE);
if(connect(dlg->clisock,(sockaddr
*)&(dlg->cli),sizeof(dlg->cli)))
{
dlg->m_listInfo.InsertString(dlg->count++,"失败");
return -1;
}
dlg->m_listInfo.InsertString(dlg->count++,"成功");
dlg->m_buttonSend.EnableWindow(TRUE);
dlg->SetForegroundWindow();
while(s!=SOCKET_ERROR)
{
s=recv(dlg->clisock,buff,100,0);
dlg->SetForegroundWindow();
if(s!=SOCKET_ERROR)
{
buff[s]='\0';
CString str =
buff;
str="服务器:"+str;
dlg->m_listInfo.InsertString(dlg->count++,str);
}
}
send(dlg->clisock,"Disconnected",100,0);
dlg->m_buttonConnect.EnableWindow(TRUE);
dlg->m_buttonDisConnect.EnableWindow(FALSE);
dlg->m_buttonSend
.EnableWindow(FALSE);
closesocket(dlg->clisock);
AfxEndThread(0);
return 0;
}
void
CWinSockClientDlg::OnExit()
{
closesocket(clisock);
DestroyWindow();
}
recv()函数:如果套接为SOCK_STREAM,默认为阻塞式,直到数据到来前决不返回
accept函数是个阻塞函数,绝对的阻塞,没有客户端连接绝不返回:
BOOL
CWinSockSeverApp::InitInstance()
{
//extra code
VERIFY(1==InitSkinMagicLib(AfxGetInstanceHandle(),NULL,NULL,NULL));
VERIFY(1==LoadSkinFile("corona.smf"));
}
在WinSockSeverDlg.h中添加变量:
public:
int GetCount();
void SendToAll(SOCKET s,char *buff);
SOCKET m_sock;
~CWinSockSeverDlg();
SOCKET msgsock[50];
int addlen;
sockaddr_in serv;
int count;
在WinSockSeverDlg.cpp
BOOL
CWinSockSeverDlg::OnInitDialog()
{
//extra code
SetWindowSkin(
m_hWnd
,
"Dialog"
);
SetDialogSkin("Dialog");
// TODO: Add extra initialization here
count=1;
m_listInfo.InsertString(0,"消息");
for(int i=0;i<50;i++)
msgsock[i]=NULL;
serv.sin_addr.s_addr=htonl(INADDR_ANY);
serv.sin_family=AF_INET;
serv.sin_port=5000;
addlen=sizeof(serv);
m_button.EnableWindow(FALSE);
m_sock=socket(AF_INET,SOCK_STREAM,0);
if(bind(m_sock,(sockaddr*)&serv,addlen))
{
AfxMessageBox("绑定错误");
}
else
{
AfxMessageBox("服务器创建成功");
listen(m_sock,5);
AfxBeginThread(&Thread,0);
}
}
void
CWinSockSeverDlg::OnButtonSend()
{
char buff[100];
m_edit.GetWindowText(buff,99);
m_edit.SetWindowText(" ");
CString str=buff;
str="服务器:"+str;
m_listInfo.InsertString(count++,str);
for(int i=0;i<50;i++)
{
if(msgsock[i]!=NULL)
{
send(msgsock[i],buff,100,0);
}
}
}
UINT Thread(LPVOID
p)
{
char buff[100];
int s=1,msgcount,loop=1,flag=0;
CWinSockSeverDlg *dlg=(
CWinSockSeverDlg *)Afx
4000
GetApp()->GetMainWnd();
msgcount=dlg->GetCount();
if(msgcount==-1)
{
loop=0;
}
if(loop)
{
s=1;
dlg->msgsock[msgcount]=accept(dlg->m_sock,(sockaddr
*)&(dlg->serv),&(dlg->addlen));
if(dlg->msgsock[msgcount]==INVALID_SOCKET)
{
dlg->m_edit.SetWindowText("Error
accept");
}
else
{
AfxBeginThread(Thread,0);
dlg->SetForegroundWindow();
dlg->m_listInfo.InsertString(dlg->count++,"连接成功");
dlg->m_listInfo.InsertString(dlg->count++,inet_ntoa(dlg->serv.sin_addr));
dlg->m_button.EnableWindow(TRUE);
while(SOCKET_ERROR!=s)
{
s=recv(dlg->msgsock[msgcount],buff,100,0);
if(SOCKET_ERROR!=s)
{buff[s]='\0';
CString
str=buff;
str="客户机:"+str;
dlg->SetForegroundWindow();
dlg->m_listInfo.InsertString(dlg->count++,str);
// dlg->SendToAll(dlg->msgsock[msgcount],buff);
}
}
send(dlg->msgsock[msgcount],"Disconnected",100,0);
dlg->m_listInfo.InsertString(dlg->count++,"Disconnected");
for(int
i=0;i<50;i++)
if(dlg->msgsock[i]!=NULL)
flag=1;
if(flag!=1)
dlg->m_button.EnableWindow(FALSE);
closesocket(dlg->msgsock[msgcount]);
}
}
AfxEndThread(0);
return 0;
}
int
CWinSockSeverDlg::GetCount()
{
for(int i=0;i<50;i++)
{
if(msgsock[i]==NULL)
return
i;
}
return -1;
}
CWinSockSeverDlg::~CWinSockSeverDlg()
{
for(int i=0;i<50;i++)
if(msgsock[i]!=NULL)
send(msgsock[i],"Disconnected",100,0);
}
用SkinMagic做对话框皮肤:
将SkinMagiclib.h,corona.smf
,SkinMagicTrial.lib,SkinMagicTrial.dll放在调试目录下
在工程-》设置->general->MFC
Foundation class选静态链接
客户机:
BOOL
CWinSockClientApp::InitInstance()
{
//extra
code
VERIFY( 1 ==
InitSkinMagicLib(AfxGetInstanceHandle(), NULL , NULL, NULL
));
VERIFY(1==LoadSkinFile("corona.smf"));
}
在WinSockClientDlg.h中
public:
~CWinSockClientDlg();
int count;
sockaddr_in cli;
SOCKET clisock;
WinSockClientDlg.cpp:
BOOL
CWinSockClientDlg::OnInitDialog()
{
// TODO: Add extra initialization
here
SetWindowSkin(
m_hWnd
,
"Dialog"
);
SetDialogSkin("Dialog");
m_editMessage.SetLimitText(99);
m_listInfo.InsertString(0,"消息");
m_buttonSend.EnableWindow(FALSE);
m_editIP.SetWindowText("127.0.0.1");
count=1;
return TRUE;
}
void
CWinSockClientDlg::OnButtonConnect()
{
char ipaddress[35];
m_editIP.GetWindowText(ipaddress,30);
cli.sin_addr .s_addr=inet_addr(ipaddress);
cli.sin_family =AF_INET;
cli.sin_port=5000;
clisock=socket(AF_INET,SOCK_STREAM,0);
AfxBeginThread(Thread,0);
}
void
CWinSockClientDlg::OnButtonDisconnect()
{
closesocket(clisock);
}
void
CWinSockClientDlg::OnButtonSend()
{
char buff[100];
m_editMessage.GetWindowText(buff,99);
m_editMessage.SetWindowText(" ");
CString str=buff;
str="客户机:"+str;
m_listInfo.InsertString(count++,str);
send(clisock,buff,100,0);
}
UINT Thread(LPVOID)
{
char buff[100];
int s=1,addcount=0;
CWinSockClientDlg *dlg=(CWinSockClientDlg
*)AfxGetApp()->GetMainWnd();
dlg->m_buttonConnect.EnableWindow(FALSE);
dlg->m_buttonDisConnect.EnableWindow(TRUE);
if(connect(dlg->clisock,(sockaddr
*)&(dlg->cli),sizeof(dlg->cli)))
{
dlg->m_listInfo.InsertString(dlg->count++,"失败");
return -1;
}
dlg->m_listInfo.InsertString(dlg->count++,"成功");
dlg->m_buttonSend.EnableWindow(TRUE);
dlg->SetForegroundWindow();
while(s!=SOCKET_ERROR)
{
s=recv(dlg->clisock,buff,100,0);
dlg->SetForegroundWindow();
if(s!=SOCKET_ERROR)
{
buff[s]='\0';
CString str =
buff;
str="服务器:"+str;
dlg->m_listInfo.InsertString(dlg->count++,str);
}
}
send(dlg->clisock,"Disconnected",100,0);
dlg->m_buttonConnect.EnableWindow(TRUE);
dlg->m_buttonDisConnect.EnableWindow(FALSE);
dlg->m_buttonSend
.EnableWindow(FALSE);
closesocket(dlg->clisock);
AfxEndThread(0);
return 0;
}
void
CWinSockClientDlg::OnExit()
{
closesocket(clisock);
DestroyWindow();
}
recv()函数:如果套接为SOCK_STREAM,默认为阻塞式,直到数据到来前决不返回
accept函数是个阻塞函数,绝对的阻塞,没有客户端连接绝不返回:
相关文章推荐
- Java基础知识强化之网络编程笔记14:TCP之多个客户端上传到一个服务器的思考(多线程改进)
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器
- 如何使用TCP/IP与服务器进行通信-一个简单的聊天程序
- 网络编程之TCP通信,为什么在Serve端为每个Client端开辟一个单独的线程来处理Client的请求
- 如何使用TCP/IP与服务器进行通信-一个简单的聊天程序
- Linux系统tcp模式下服务器与客户端通信(仅限一个客户端)
- 基于TCP网络通信的自动升级程序源码分析-服务器发送文件
- 网络通信_TCP客户端与服务器
- Java基础知识强化之网络编程笔记07:TCP之服务器给客户端一个反馈案例
- 黑马程序员--图形界面中的鼠标,键盘两个事件,做一个磁盘的文件列表,菜单,子菜单,模拟记事本。网络编程,TCP的通信协议的特点
- 基于select模型的tcp服务器------一个服务器如何与多个客户端进行通信?
- 一个在服务器上运行的TCP通信转发服务器[Java]
- 基于linux poll模型的tcp服务器------一个服务器如何与多个客户端进行通信?
- Python网络编程之socket编程(一)--使用TCP和UDP客户端和服务器通信
- JAVA之TCP网络通信一个小例子
- uc笔记10---网络通信,套接字(Socket),基于 TCP 协议的客户机/服务器模型
- 基于TCP网络通信的自动升级程序源码分析-客户端请求服务器上的升级信息
- linux c之网络编程之TCP(服务器和和客户端基础通信)
- Lniux网络通信二(TCP三次握手,四次挥手 并发服务器)
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器