关于CSocket::Create()的问题

etarip 2003-12-03 10:42:38
我实现了一个SOCK_STREAM模式的文件发送端程序和接收端程序

在发送端,我想从文本框读入用户输入的接收端IP地址,然后调用CSocket::Create(UINT nSocketPort = 0,int nSocketType = SOCK_STREAM,LPCTSTR lpszSocketAddress= NULL ),其中IP地址作为参数之一。我的意图是仅对该IP地址进行监听。代码如下:

CSocket sockSrvr;
CString szIP;
GetDlgItemText(IDC_EDIT_IPADDRESS,szIP); //读入一个IP地址字符串
if(!sockSrvr.Create(9999,SOCK_STREAM,(LPCTSTR)szIP))
{
DWORD err = GetLastError();
AfxMessageBox("连接到对方机器失败!");
return;
}
sockSrvr.Listen();
CSocket sockRecv;
sockSrvr.Accept(sockRecv);
……………………

但是,如果文本框输入本机IP地址,运行正常;若输入其他IP地址,则会报错:AfxMessageBox("连接到对方机器失败!");


希望大家解释原因,由于我初次学习网络编程,可能基本概念还不太清楚,我是想达到仅对用户输入IP地址进行监听的效果,是否可行?


谢谢了!
...全文
484 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
etarip 2003-12-04
  • 打赏
  • 举报
回复
请您解释CSocket::Create(UINT nSocketPort=0,int nSocketType=SOCK_STREAM,LPCTSTR lpszSocketAddress=NULL)这个函数,指定lpszSocketAddress与取默认NULL有什么区别呢?

Create的时候是创建监听,且只能监听本机,那参数lpszSocketAddress不取默认NULL,则必须填本机IP吗?

我可能有这样的误解:

服务端调用Create的时候的确创建监听,而且是监听本机。

若服务端调用Create时参数lpszSocketAddress取默认NULL时,任何其他IP都可以调用CSocket::Connect(/*服务端IP*/, 9999)),与服务端成功连接;
若服务端调用Create时参数lpszSocketAddress指定为某**客户端**IP,则只有被指定的IP客户端机器调用CSocket::Connect(/*服务端IP*/, 9999)),才能与服务端成功连接;其他非指定IP即使调用Connect(/*服务端IP*/, 9999)),服务端都不接受,既sockSrvr.Accept(sockRecv);不返回。


请您解释一下,我的认识错误之处在哪里?谢谢




poweruser 2003-12-04
  • 打赏
  • 举报
回复
Create的时候是创建监听,默认可以为空的,但你的socket是要在本机监听而不是要在其他机器上监听对吧

如果你只想对指定ip监听的话,你需要在Accept的时候判断一下对方的IP就可以了

7,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧