小弟最近才开始学习vc,编了个csocket传输的简单程序,程序有一个接收线程跟一个发送线程,接收线程(当服务器用)调用csocket的create(port),bind()listen(),accept()函数,发送线程(当客户端用)用的是create()和connect(ip,port);在局域网内跟另外一台电脑的连接没有问题,使用的是网内的地址如192.168.1.23.但是和外网的电脑连接的时候却连接不上,请问是不是在ip地址的连接方面有什么问题.
我的bind的port都是设置同一个端口,ip是通过函数获取的本地ip,函数调用在listen之前.不知道在什么地方有错误.
还有就是想问一下如果我的程序在一个局域网内的两台电脑上运行,都是监听一个端口,但是他们和外网通信时都用一个ip,我连接这个ip时候会和谁连上?对网络方面不是很熟悉.谢谢解答
我的bind的port都是设置同一个端口,ip是通过函数获取的本地ip,函数调用在listen之前.不知道在什么地方有错误.
还有就是想问一下如果我的程序在一个局域网内的两台电脑上运行,都是监听一个端口,但是他们和外网通信时都用一个ip,我连接这个ip时候会和谁连上?对网络方面不是很熟悉.谢谢解答
除非你用nat穿透
多看看网络基础的书吧
在内网的机器通过nat时会分配另外一个端口的。你要先获得这个分配的端口,外网的机器才可以链接
另问:服务器给子网内分配的port是随机分配的吗?
有本<<windows网络编程>> 清华大学出版的,不错的入门书籍。
char strHostName[128];
memset(strHostName,0,128);
if(gethostname(strHostName,128)==SOCKET_ERROR)
{
PostMessage(g_hMain,WM_MYMESSAGE,5,0);
CReceiveThread::EndThread();
}
CString str;
CString ip;
str.Format("%s",strHostName);
HOSTENT *pHS=gethostbyname(str.GetBuffer(str.GetLength()));
if(pHS!=NULL)
{
int i=0;
while(pHS->h_addr_list[i])ip+=inet_ntoa(*(struct in_addr*)pHS->h_addr_list[i++]);
}
while(m_bRun==TRUE)
{
CReceiveSocket Tempsock,Recsock;//CRreceiveSocket是由CSocket派生的,没改写.
if(!Tempsock.Create(6555))
{
Sleep(100);
continue;
}
if(Tempsock.Bind(6555,ip))
{
Tempsock.Close();
Sleep(100);
continue;
}
if(!Tempsock.Listen())
{
Tempsock.Close();
Sleep(200);
continue;
}
Tempsock.Accept(Recsock);
...
...
}
在发送线程是这样的:
while(m_bRun)
{
CSendSocket Sendsock;//CSocket派生,未改写
memset(ftpNode,0,sizeof(FtpTaskNode));
if(g_FtpQueue->PickNode(ftpNode))
{
if(!Sendsock.Create())
{
Sleep(100);
continue;
}
if(!Sendsock.Connect(ftpNode->m_strServerip,ftpNode->m_nPort))
{
Sendsock.Close();
PostMessage(g_hMain,WM_MYMESSAGE,5,0);//提示连接不上,
continue;
}
......
}
不知道在什么地方有问题,在局域网里能和其他机器连上.