多线程 + SOCKET,无法连接服务器。请大家帮忙指点(50分)

  • 主题发起人 主题发起人 涅磐的凤凰
  • 开始时间 开始时间

涅磐的凤凰

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做一个数据转发程序(TCP/IP方式)
C表示客户端,P表示转发服务器,S表示服务端
现在C向P发送一条消息,再由P把这条消息发给S
点击C的发送按钮,可以跟P建立连接并发送聊天信息给P
P可以正常接收。


P在接收以后,需要跟S建立连接,并把接收到的信息发给S;现在问题就出在这里
代码如下:
P的监听按钮
void CtransferDlg::OnBnClickedBtnStart()
{
// TODO: 在此添加控件通知处理程序代码
//创建Tcp服务器socket
SOCKET sockSrv = socket( AF_INET , SOCK_STREAM , 0 );
//服务器地址
SOCKADDR_IN addrSrv
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY)
addrSrv.sin_family = AF_INET
addrSrv.sin_port = htons(7001)
//将socket与地址绑定在一起
if(SOCKET_ERROR == bind(sockSrv ,(SOCKADDR*)&addrSrv , sizeof(SOCKADDR)))
{
MessageBox("地址邦定失败!");
return;
}
//开始监听客户端请求,最大连接数为5
if(SOCKET_ERROR == listen( sockSrv , 5))
{
MessageBox("监听失败!");
return;
}
//创建监听线程
::CreateThread(NULL, 0, listenThread, (LPVOID)sockSrv, 0, NULL);
//IDC_BTN_START是监听按钮的ID号
GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);
}
监听线程
DWORD WINAPI CtransferDlg::listenThread(LPVOID lpParameter)
{
//用于存放客户端地址
SOCKADDR_IN addrClient
int len = sizeof( SOCKADDR_IN );
while(TRUE)
{
SOCKET sockConn = accept((SOCKET)lpParameter, (SOCKADDR *)addrClient , &len);

//接收数据
char recvBuf[100]
recv(sockConn , recvBuf , 100 , 0);
//关闭socket
closesocket(sockConn);
//连接服务器线程
::CreateThread(NULL, 0, ConnectThread, (LPVOID)recvBuf, 0, NULL);
}
return 0;
}


/////////////////////////////////////////////////////////////////////////////////////////
以上代码都正常
/////////////////////////////////////////////////////////////////////////////////////////
以上代码都正常
/////////////////////////////////////////////////////////////////////////////////////////
以上代码都正常
/////////////////////////////////////////////////////////////////////////////////////////
以上代码都正常


/////////////////////////////////////////////////////////////////////////////////////////
下面是出错的代码
/////////////////////////////////////////////////////////////////////////////////////////
下面是出错的代码
/////////////////////////////////////////////////////////////////////////////////////////
下面是出错的代码
/////////////////////////////////////////////////////////////////////////////////////////
下面是出错的代码




转发器连接服务器线程
DWORD WINAPI CtransferDlg::ConnectThread(LPVOID lpParameter)
{
//用于存放客户端地址
SOCKADDR_IN addrClient
int len = sizeof( SOCKADDR_IN );

char recvBuf[100]
strcpy(recvBuf, (char *)lpParameter);
::MessageBox(NULL, recvBuf, "transfer", MB_OK);

//建立客户端socket
SOCKET sockClient = socket( AF_INET ,SOCK_STREAM , 0)
//服务器地址
SOCKADDR_IN addrSrv
//连接局域网中另外一台计算机
addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.0.16")
addrSrv.sin_family = AF_INET
addrSrv.sin_port = htons(7001);
//=======================================================================//

从这里开始,下面的代码就不执行了
从这里开始,下面的代码就不执行了
从这里开始,下面的代码就不执行了
//======================================================================//
//连接服务端
if(SOCKET_ERROR == connect(sockClient , (SOCKADDR*)&addrSrv , sizeof(SOCKADDR)))
{
::MessageBox(NULL, "转发服务器连接服务端失败", "transfer", MB_OK);
return -1;
}
send(sockClient , recvBuf , strlen(recvBuf)+1 , 0);
closesocket(sockClient);
return 0;
}

请问我出错在什么地方
 
太多代码了。把代码精简一下,别人才看好
 
首先需要确定 P 能否搭上 S
 
后退
顶部