(多线程版本)完美服务器连接客户端(实例)
2010-03-24 22:45
585 查看
服务器端:
void CCWebServerDlg::OnButStartserver()
{
// TODO: Add your control notification handler code here
//initialize Winsock
WSADATA wsaData;
CString cs_err;
int iRet=WSAStartup(MAKEWORD(1,1),&wsaData);
if(iRet!=NO_ERROR)
MessageBox("Error at WSAStartup()\n");
//create a socket
SOCKET m_socket;
m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_socket==INVALID_SOCKET)
{
cs_err.Format("Error at socket():%ld\n",WSAGetLastError());
MessageBox(cs_err);
WSACleanup();
return ;
}
//bind a socket
sockaddr_in service;
service.sin_family=AF_INET;
service.sin_addr.s_addr=htonl(INADDR_ANY);//自动获取本机IP地址
service.sin_port=htons(9999);
if(bind(m_socket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
{
MessageBox("bind() failed.\n");
closesocket(m_socket);
return ;
}
else
MessageBox("bind OK.\n");
//listen on a socket
if(listen(m_socket,20)==SOCKET_ERROR)
MessageBox("Error listening on socket.\n");
else
MessageBox("listening ok.\n");
//accept a connection
SOCKET AcceptSocket;
MessageBox("Waiting for a client to connect...\n");
while(1)
{
AcceptSocket=SOCKET_ERROR;
while(AcceptSocket==SOCKET_ERROR)
{
AcceptSocket=accept(m_socket,NULL,NULL); /////////////////这里出现阻塞
}
MessageBox("Client Connected.\n");
DWORD dwThreadId;
HANDLE hThread;
hThread=CreateThread(NULL,NULL, AnswerThread, (LPVOID)AcceptSocket,0,&dwThreadId);
if(hThread==NULL)
{
MessageBox("CreatThread AnswerThread() failed.\n");
}
else
{
MessageBox("CreateThread OK.\n");
}
}
return ;
}
DWORD WINAPI CCWebServerDlg::AnswerThread(LPVOID lparam)
////注意: static DWORD WINAPI AnswerThread(LPVOID lparam);
{
SOCKET ClientSocket=(SOCKET)(LPVOID)lparam;
int bytesRecv;
char sendbuf[32]="";
char recvbuf[32]="";
CString cs_err;
while(1)
{
bytesRecv=SOCKET_ERROR;
for(int i=0;i<(int)strlen(recvbuf);i++)
{ recvbuf[i]='\0'; }
while(bytesRecv==SOCKET_ERROR)
{ //Receiving Data
bytesRecv=recv(ClientSocket,recvbuf,32,0);
}
//Write your processing code here
send(ClientSocket,recvbuf,strlen(recvbuf),0);
cs_err.Format("%s",recvbuf);
AfxMessageBox(cs_err);
}
return 0;
}
客户端:
void CCWebClientDlg::LinkServer()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
CString cs_err;
wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1
//1.加载套接字库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
MessageBox("Error at WSAStartup()\n");
return;
}
//判断是否我们请求的winsocket版本,如果不是
//则调用WSACleanup终止winsocket的使用并返回
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}///...if
//2.创建套接字
SOCKET sockClient = socket (AF_INET, SOCK_STREAM, 0);
if(sockClient==INVALID_SOCKET)
{
cs_err.Format("Error at socket():%ld\n",WSAGetLastError());
MessageBox(cs_err);
WSACleanup();
return ;
}
//3.连接服务器端,无须绑定
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr(ip);
//设定服务器端IP地址,"127.0.0.1"是本地回路地址
//不管本地主机上有没有网卡,都可以用这个IP测试网络
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(PORT); //端口号要与服务器端保持一致
// connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));
//连接服务器
if(connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR)) < 0)
{
closesocket(sockClient);
MessageBox("连接服务器失败。");
return ;
}
//4.先向服务器端发送数据,再接收服务器端发送的数据
///////////////////
//发送到服务端的数据
/*
CString szBuf1;
GetDlgItem(IDC_MSG)->GetWindowText(szBuf1);//显示在对话框中
char sendBuf[1024];
strncpy(sendBuf,szBuf1,sizeof(sendBuf));
//MessageBox("sssssssss1");
send(sockClient,(LPCTSTR)sendBuf,strlen(sendBuf)+1,0);
//MessageBox("sssssssss2");
char recvBuf[1024];
int m;
m=recv(sockClient,recvBuf,1024,0);
CString szBuf;
szBuf.Format("%s",recvBuf);
GetDlgItem(IDC_RECEIVEMSG)->SetWindowText(szBuf);
//MessageBox(sendBuf);
*/
//5.关闭套接字,释放资源,并且终止对套接字库的使用
closesocket(sockClient);
WSACleanup();
//加头文件< winsock2.h.>
//连接 ws2_32.lib
}
//////////////初始化网络设置
void CCWebClientDlg::InitSocket()
{
WORD wVersionRequested;
WSADATA wsaData;
char name[255];
// CString ip;
int err;
PHOSTENT hostinfo;
wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1
//1.加载套接字库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
//判断是否我们请求的winsocket版本,如果不是
//则调用WSACleanup终止winsocket的使用并返回
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}///...if
if ( err == 0 )
{
if( gethostname ( name, sizeof(name)) == 0)
{
if((hostinfo = gethostbyname(name)) != NULL)
{
ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
}
}
WSACleanup( );
}
SetDlgItemText(IDC_IPADDRESS1,ip); //ip中是本机IP
// SetDlgItemText(IDC_EDIT_PORT,name);//name里是本机名
CString cs_Port;
int i_Port;
i_Port =PORT;
cs_Port.Format("%d",i_Port);
SetDlgItemText(IDC_EDIT_PORT,cs_Port);
}
void CCWebServerDlg::OnButStartserver()
{
// TODO: Add your control notification handler code here
//initialize Winsock
WSADATA wsaData;
CString cs_err;
int iRet=WSAStartup(MAKEWORD(1,1),&wsaData);
if(iRet!=NO_ERROR)
MessageBox("Error at WSAStartup()\n");
//create a socket
SOCKET m_socket;
m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_socket==INVALID_SOCKET)
{
cs_err.Format("Error at socket():%ld\n",WSAGetLastError());
MessageBox(cs_err);
WSACleanup();
return ;
}
//bind a socket
sockaddr_in service;
service.sin_family=AF_INET;
service.sin_addr.s_addr=htonl(INADDR_ANY);//自动获取本机IP地址
service.sin_port=htons(9999);
if(bind(m_socket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
{
MessageBox("bind() failed.\n");
closesocket(m_socket);
return ;
}
else
MessageBox("bind OK.\n");
//listen on a socket
if(listen(m_socket,20)==SOCKET_ERROR)
MessageBox("Error listening on socket.\n");
else
MessageBox("listening ok.\n");
//accept a connection
SOCKET AcceptSocket;
MessageBox("Waiting for a client to connect...\n");
while(1)
{
AcceptSocket=SOCKET_ERROR;
while(AcceptSocket==SOCKET_ERROR)
{
AcceptSocket=accept(m_socket,NULL,NULL); /////////////////这里出现阻塞
}
MessageBox("Client Connected.\n");
DWORD dwThreadId;
HANDLE hThread;
hThread=CreateThread(NULL,NULL, AnswerThread, (LPVOID)AcceptSocket,0,&dwThreadId);
if(hThread==NULL)
{
MessageBox("CreatThread AnswerThread() failed.\n");
}
else
{
MessageBox("CreateThread OK.\n");
}
}
return ;
}
DWORD WINAPI CCWebServerDlg::AnswerThread(LPVOID lparam)
////注意: static DWORD WINAPI AnswerThread(LPVOID lparam);
{
SOCKET ClientSocket=(SOCKET)(LPVOID)lparam;
int bytesRecv;
char sendbuf[32]="";
char recvbuf[32]="";
CString cs_err;
while(1)
{
bytesRecv=SOCKET_ERROR;
for(int i=0;i<(int)strlen(recvbuf);i++)
{ recvbuf[i]='\0'; }
while(bytesRecv==SOCKET_ERROR)
{ //Receiving Data
bytesRecv=recv(ClientSocket,recvbuf,32,0);
}
//Write your processing code here
send(ClientSocket,recvbuf,strlen(recvbuf),0);
cs_err.Format("%s",recvbuf);
AfxMessageBox(cs_err);
}
return 0;
}
客户端:
void CCWebClientDlg::LinkServer()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
CString cs_err;
wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1
//1.加载套接字库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
MessageBox("Error at WSAStartup()\n");
return;
}
//判断是否我们请求的winsocket版本,如果不是
//则调用WSACleanup终止winsocket的使用并返回
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}///...if
//2.创建套接字
SOCKET sockClient = socket (AF_INET, SOCK_STREAM, 0);
if(sockClient==INVALID_SOCKET)
{
cs_err.Format("Error at socket():%ld\n",WSAGetLastError());
MessageBox(cs_err);
WSACleanup();
return ;
}
//3.连接服务器端,无须绑定
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr(ip);
//设定服务器端IP地址,"127.0.0.1"是本地回路地址
//不管本地主机上有没有网卡,都可以用这个IP测试网络
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(PORT); //端口号要与服务器端保持一致
// connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));
//连接服务器
if(connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR)) < 0)
{
closesocket(sockClient);
MessageBox("连接服务器失败。");
return ;
}
//4.先向服务器端发送数据,再接收服务器端发送的数据
///////////////////
//发送到服务端的数据
/*
CString szBuf1;
GetDlgItem(IDC_MSG)->GetWindowText(szBuf1);//显示在对话框中
char sendBuf[1024];
strncpy(sendBuf,szBuf1,sizeof(sendBuf));
//MessageBox("sssssssss1");
send(sockClient,(LPCTSTR)sendBuf,strlen(sendBuf)+1,0);
//MessageBox("sssssssss2");
char recvBuf[1024];
int m;
m=recv(sockClient,recvBuf,1024,0);
CString szBuf;
szBuf.Format("%s",recvBuf);
GetDlgItem(IDC_RECEIVEMSG)->SetWindowText(szBuf);
//MessageBox(sendBuf);
*/
//5.关闭套接字,释放资源,并且终止对套接字库的使用
closesocket(sockClient);
WSACleanup();
//加头文件< winsock2.h.>
//连接 ws2_32.lib
}
//////////////初始化网络设置
void CCWebClientDlg::InitSocket()
{
WORD wVersionRequested;
WSADATA wsaData;
char name[255];
// CString ip;
int err;
PHOSTENT hostinfo;
wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1
//1.加载套接字库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
//判断是否我们请求的winsocket版本,如果不是
//则调用WSACleanup终止winsocket的使用并返回
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}///...if
if ( err == 0 )
{
if( gethostname ( name, sizeof(name)) == 0)
{
if((hostinfo = gethostbyname(name)) != NULL)
{
ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
}
}
WSACleanup( );
}
SetDlgItemText(IDC_IPADDRESS1,ip); //ip中是本机IP
// SetDlgItemText(IDC_EDIT_PORT,name);//name里是本机名
CString cs_Port;
int i_Port;
i_Port =PORT;
cs_Port.Format("%d",i_Port);
SetDlgItemText(IDC_EDIT_PORT,cs_Port);
}
相关文章推荐
- 多线程Socket编程实现服务器与客户端的连接
- linux tcp多线程服务器与客户端编程实例
- ZooKeeper客户端 和服务器连接时版本问题
- zookeeper客户端 和服务器连接时版本问题
- (二)用多线程管理TCP多个客户端连接服务器
- loadrunner使用socket协议来实现客户端对服务器产生压力实例。(通过发送心跳包,达到连接多个客户端的目的)
- Java-WebSocket 项目的研究(二) :客户端连接服务器并发送消息实例
- 同一服务器上多个版本的 sqlserver ,如何连接,改变某一实例的端口号
- zookeeper客户端 和服务器连接时版本问题
- Atom远程连接服务器报错服务器版本和客户端版本不一致
- 如何通过在 SQL Server 的早期版本使用客户端工具连接到的 SQL Server 2005 或 SQL Server 2000 命名实例
- zookeeper客户端 和服务器连接时版本问题
- 多线程编程实例----服务器客户端简单通信
- zookeeper客户端 和服务器连接时版本问题
- Qt套接字编程 (《精通Qt4编程》文件传输实例分析 & 多客户端连接服务器)
- ZooKeeper客户端 和服务器连接时版本问题
- Java-WebSocket 项目的研究(二) :客户端连接服务器并发送消息实例
- 在建立与服务器的连接时出错:此版本的 SQL Server 不支持用户实例登录标志。该连接将关
- db2实例配置,db2客户端连接服务器配置
- Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端