有两个关于socket的问题,希望大家帮忙解答,不胜感激!!!

时间:2020-12-10 19:50:55
第一,如何使用socket获取本机的IP地址?
第二,我用socket做了一个小的聊天室程序,但是出现了一种情况就是如果server端的计算机IP地址是自动获取的,client端就连接不上server,而如果server端的IP地址是手动填写的就能连接上,请问这是怎么回事啊?

9 个解决方案

#1


如果你是想要服务器端绑定本机监听端口,哪么只要将本机地址参数填0就行了。
如果你的server端代码写死了绑定固定IP的方式,
哪么就可能出现当自动获取的IP不是代码写死绑定的IP时,CLIENT连接失败的现象。

#2


如果你是客户端想连接指定IP的服务器,
使用inet_addr("192.168.0.100");得到服务器的地址
然后使用connect函数连接,好像也是不需要用到获取本地IP地址的函数。

#3


我也在学习这方面的知识,准备开发一个下载软件。关注。

#4


引用 1 楼 dragon33tree 的回复:
如果你是想要服务器端绑定本机监听端口,哪么只要将本机地址参数填0就行了。
如果你的server端代码写死了绑定固定IP的方式,
哪么就可能出现当自动获取的IP不是代码写死绑定的IP时,CLIENT连接失败的现象。


这是我的部分代码,设置server的

  m_socket = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,0);
  if(INVALID_SOCKET == m_socket)
  {
    MessageBox("初始化socket失败!");
    return false;
  }
  sockaddr_in addrSock;
  addrSock.sin_family = AF_INET;
  addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
  addrSock.sin_port = htons(6000);
  if(SOCKET_ERROR == bind(m_socket,(sockaddr*)&addrSock,sizeof(sockaddr)))
  {
    MessageBox("绑定socket失败!");
    return false;
  }
  listen(m_socket,5);

#5


楼上的代码看不出有什么问题,
哪么就问一下,
“server端的计算机IP地址是自动获取的IP” 跟 “server端的IP地址是手动填写的” 是正好相同的吗?

#6


另外确认调用了WSAStartup了没有?

#7


引用 6 楼 dragon33tree 的回复:
另外确认调用了WSAStartup了没有?

这个调用了,再就是我说的自动获取和手动填写都指的是在本地连接的属性里面,不是在程序里面

#8


引用 7 楼 disa16 的回复:
引用 6 楼 dragon33tree 的回复:
另外确认调用了WSAStartup了没有?

这个调用了,再就是我说的自动获取和手动填写都指的是在本地连接的属性里面,不是在程序里面



自然是系统本地连接里面的。
我的意思就是问你这个了,
因为客户端要连接到服务器去,是必须要写入固定的服务器IP的。
这里,你客户端程序里写入connect的IP肯定就是你手动填写服务器的IP(假设192.168.0.20)了。
但是如果你服务器使用自动获取的IP是192.168.0.49,
这个时候,你的客户端还是写死的connect(192.168.0.20)的话,是肯定连接不成功的。
首先先确认你自动获取的IP是否跟你客户端connect的IP相同。

#9


学习下。。。

#1


如果你是想要服务器端绑定本机监听端口,哪么只要将本机地址参数填0就行了。
如果你的server端代码写死了绑定固定IP的方式,
哪么就可能出现当自动获取的IP不是代码写死绑定的IP时,CLIENT连接失败的现象。

#2


如果你是客户端想连接指定IP的服务器,
使用inet_addr("192.168.0.100");得到服务器的地址
然后使用connect函数连接,好像也是不需要用到获取本地IP地址的函数。

#3


我也在学习这方面的知识,准备开发一个下载软件。关注。

#4


引用 1 楼 dragon33tree 的回复:
如果你是想要服务器端绑定本机监听端口,哪么只要将本机地址参数填0就行了。
如果你的server端代码写死了绑定固定IP的方式,
哪么就可能出现当自动获取的IP不是代码写死绑定的IP时,CLIENT连接失败的现象。


这是我的部分代码,设置server的

  m_socket = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,0);
  if(INVALID_SOCKET == m_socket)
  {
    MessageBox("初始化socket失败!");
    return false;
  }
  sockaddr_in addrSock;
  addrSock.sin_family = AF_INET;
  addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
  addrSock.sin_port = htons(6000);
  if(SOCKET_ERROR == bind(m_socket,(sockaddr*)&addrSock,sizeof(sockaddr)))
  {
    MessageBox("绑定socket失败!");
    return false;
  }
  listen(m_socket,5);

#5


楼上的代码看不出有什么问题,
哪么就问一下,
“server端的计算机IP地址是自动获取的IP” 跟 “server端的IP地址是手动填写的” 是正好相同的吗?

#6


另外确认调用了WSAStartup了没有?

#7


引用 6 楼 dragon33tree 的回复:
另外确认调用了WSAStartup了没有?

这个调用了,再就是我说的自动获取和手动填写都指的是在本地连接的属性里面,不是在程序里面

#8


引用 7 楼 disa16 的回复:
引用 6 楼 dragon33tree 的回复:
另外确认调用了WSAStartup了没有?

这个调用了,再就是我说的自动获取和手动填写都指的是在本地连接的属性里面,不是在程序里面



自然是系统本地连接里面的。
我的意思就是问你这个了,
因为客户端要连接到服务器去,是必须要写入固定的服务器IP的。
这里,你客户端程序里写入connect的IP肯定就是你手动填写服务器的IP(假设192.168.0.20)了。
但是如果你服务器使用自动获取的IP是192.168.0.49,
这个时候,你的客户端还是写死的connect(192.168.0.20)的话,是肯定连接不成功的。
首先先确认你自动获取的IP是否跟你客户端connect的IP相同。

#9


学习下。。。