18,356
社区成员
发帖
与我相关
我的任务
分享
void CXXX::ConnectToServer(CString strIP, int nPort)
{
m_strIP = strIP;
m_nPort = nPort;
//如果有连接,断开
if (m_bConnected)
{
DisConnect();
}
//初始化socket
m_socket = socket(AF_INET, SOCK_STREAM,0);
if (m_socket == INVALID_SOCKET)
{
AfxMessageBox(_T("Failed to creat socket!Can't connect to server."));
return ;
}
//设置端口重用
int iOptVal = 1;
if( setsockopt(m_socket,SOL_SOCKET, SO_REUSEADDR,(char*)&iOptVal, sizeof(iOptVal)) == -1 )
return ;
//绑定6000端口
sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port= htons(6000); //保证字节顺序
addr.sin_addr.s_addr= inet_addr("127.0.0.1");
int nResult=bind(m_socket,(sockaddr*)&addr,sizeof(sockaddr));
if(nResult==SOCKET_ERROR)
{
addr.sin_port = htons(0);
nResult =bind(m_socket,(sockaddr*)&addr,sizeof(sockaddr));
}
//设置服务器信息,strIP是“192.168.1.50”形式
int nLength = strIP.GetLength();
char * pIP = new char[nLength+1];
memset(pIP,0,nLength+1);
wcstombs(pIP, strIP,strIP.GetLength());
m_inetAddr.sin_family = AF_INET;
m_inetAddr.sin_port = htons(nPort);
m_inetAddr.sin_addr.S_un.S_addr = inet_addr(pIP);
delete pIP;
//连接线程,ConnProc是一个线程函数,在里面执行connect连接
HANDLE hThread=CreateThread(NULL,0,ConnProc,(LPVOID)this,0,NULL);
CloseHandle(hThread);
}
//断开连接
void CXXX::DisConnect()
{
if( m_socket != INVALID_SOCKET)
{
/*
//设置端口不延迟关闭
LINGER lingerStruct;
lingerStruct.l_onoff = 1;
lingerStruct.l_linger = 0;
setsockopt( m_socket, SOL_SOCKET, SO_LINGER,
(char *)&lingerStruct, sizeof(lingerStruct) );
*/
//shutdown(m_socket, SB_BOTH);
closesocket(m_socket);
m_bConnected = false;
m_socket = INVALID_SOCKET;
}
}
//断开连接
void CXXX::DisConnect()
{
if( m_socket != INVALID_SOCKET)
{
//设置端口不延迟关闭
LINGER lingerStruct;
lingerStruct.l_onoff = 1;
lingerStruct.l_linger = 0;
setsockopt( m_socket, SOL_SOCKET, SO_LINGER,
(char *)&lingerStruct, sizeof(lingerStruct) );
closesocket(m_socket);
m_bConnected = false;
m_socket = INVALID_SOCKET;
}
}