mfc的TCP连接的双向通信程序 服务器端的accept函数怎么写

我先新建个类CMySocket继承自CAsyncSocket,然后创建2个套接字CMySocketm_sockListen、CMySocketm_sockServer,用... 我先新建个类CMySocket继承自CAsyncSocket ,然后创建2个套接字
CMySocket m_sockListen、CMySocket m_sockServer,
用m_sockListen创建和监听 m_sockServer用来接收和发送服务
我的accept函数是这样写的 能编译但是运行没效果
SOCKADDR sockAddr; int nSockAddrLen = sizeof(SOCKADDR);然后调用
m_sockListen.Accept(m_sockServer,&sockAddr,&nSockAddrLen)
求教~~~
展开
 我来答
Drawing_zy
2011-02-13
知道答主
回答量:6
采纳率:0%
帮助的人:0
展开全部
//服务端:
//服务器接受线程数据
UINT CTcpSrvDlg::ReThreadFunc(LPVOID lParam)
{
CTcpSrvDlg *pDlgSrv = (CTcpSrvDlg*)lParam;

WORD wVersionRequested;//当前网络Socket版本号
WSADATA wsaData;//定义当前网络信息对象
int err;
int iError ;
CString str;

wVersionRequested = MAKEWORD( 1, 1 );//(1.1)版本
//===1、初始化网络设备环境===
err = WSAStartup( wVersionRequested, &wsaData );
//如果WSAStartup返回值为0,则初始化成功
if ( err != 0 )
{
return 1L;
}
//如果网络环境版本不对应,则清空网络设备环境并结束当前线程
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
{
AfxMessageBox("版本不匹配");
//清空网络设备环境
::WSACleanup();
return 1L;
}

//===2、加载套接字===
SOCKET socketSvr = ::socket(AF_INET/*通信区域*/, SOCK_STREAM/*数据流式——TCP*/, 0);
if (INVALID_SOCKET == ::WSAGetLastError())
{
AfxMessageBox("加载套接字失败");
::WSACleanup();
::closesocket(socketSvr);

return 1L;
}

//===3、套接字绑定
//初始化当前主机地址信息结构体对象
SOCKADDR_IN addSrv;
addSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//允许任何IP的主机与之相连
addSrv.sin_family = AF_INET;//通信网际域
addSrv.sin_port = htons(7000);//0——65355端口,自定义要大一些>1000

iError = ::bind(socketSvr, (SOCKADDR*)&addSrv, sizeof(SOCKADDR_IN));
//校验是否绑定成功
if (SOCKET_ERROR == iError)
{
AfxMessageBox("套接字绑定失败");
::WSACleanup();
::closesocket(socketSvr);
return 1L;
}

//===监听===
iError = ::listen(socketSvr, SOMAXCONN/*等待连接堆内的最大来访者个数,
如果设置为SOMAXCONN,
则下层的服务提供者负责将套接字设置backlog值为最大的合理的值。*/
);
if (SOCKET_ERROR == iError)
{
AfxMessageBox("监听失败");
::WSACleanup();
::closesocket(socketSvr);
return 1L;
}

//===5、接受请求的客户机的套接字信息===
SOCKET sockClient;
SOCKADDR_IN addrClient;
int iAddrLen = sizeof(SOCKADDR_IN);
while (1)
{
//接受对方的套接字信息
::accept(socketSvr/*服务器接受*/, (SOCKADDR*)&addrClient, &iAddrLen);
//===6、接受客户端发过来的数据===
char recvBuf[100];
iError = ::recv(sockClient, recvBuf, 100, 0);
if(SOCKET_ERROR == iError)
{
AfxMessageBox("数据接受失败");
}
//将接受过来的数据显示ListBox中
str.Format("%s",recvBuf);
pDlgSrv->m_lbRecv.AddString(str);

}
::closesocket(socketSvr);
::WSACleanup();

return 1L;
}
匿名用户
2011-02-14
展开全部
我记得那个函数与你写的有一点差别。
那个函数原型是这样的:
SOCKET accept( SOCKET s,struct sockaddr FAR *addr,int FAR *addrlen);

第一个参数是被置于监听状态的SOCKET,第二个参数是用来接收发送连接的SOCKET的地址,第三个参数是接收到的地址的长度。

按你的参数应当是:
sockAddr = accept(m_sockServer,&sockAddr,&nSocketLen);
if(INVALID_SOCKET == sockAddr)
{
Afxmessagebox("Accept SOCKET fail!");
return 0;
}
因为accept是一个阻塞函数,所以建议创建一个线程后在线程中处理这个函数。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sniper_bing
2011-02-14
知道答主
回答量:67
采纳率:0%
帮助的人:19.6万
展开全部
估计你没初始化socket
WSAStartup
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式