关于socket的奇怪问题

CodeJockey 2007-10-22 09:40:58
SOCKET socket = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(socket == INVALID_SOCKET)
return;
//非阻塞模式
unsigned long ul = 1;
if(::ioctlsocket(socket,FIONBIO,(unsigned long *)&ul) == SOCKET_ERROR)
{
::closesocket(socket);
return;
}

struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(5401);//服务器端口
server.sin_addr.s_addr = inet_addr((LPCSTR)"127.0.0.1");//服务器IP地址

::connect(socket,(const struct sockaddr *)&server,sizeof(server));

struct timeval timeout ;
fd_set r;
FD_ZERO(&r);
FD_SET(socket,&r);
timeout.tv_sec = 15;//连接超时时间
timeout.tv_usec = 0;
INT iRc = ::select(0,0,&r,0,&timeout);
if(iRc <= 0)
{
::closesocket(socket);
return;
}


上面一段代码是客服端的socket代码,现在的问题是,我把客户端放在和服务器不同的机器上(服务器Ip地址变化一下),客户端执行的很正常,但是,如果我把客户端放在
和服务器相同的机器上(Ip地址变为127.0.0.1或者不变),select函数的返回总是零,也就是总是select超时,我把超时时间设置的很长,也是同样的问题。请教大家卫生么会出现这样的问题呢?
...全文
102 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kgdiwss 2007-10-23
  • 打赏
  • 举报
回复
你把127.0.0.1换成真实IP看看。
arong1234 2007-10-23
  • 打赏
  • 举报
回复
再做几件事情
1. 用netstat -ano 看看5401端口是否处于侦听状态
2. 在本机用telnet localhost 5401和telnet 192.168.0.xxx 5401分别看看能否连上
3. 贴出你用192.168.0.xxx链接的修改后的代码
CodeJockey 2007-10-23
  • 打赏
  • 举报
回复
to arong1234 :
先谢谢了,试了你的两件事,还是不行,真是郁闷了,到底什么原因呢?
arong1234 2007-10-23
  • 打赏
  • 举报
回复
做两件事情试试
1. 在connect前给socket bind一个port为0的地址
2. 把sockaddr_in的8个填充字节设为0,也就是在你每次操作sockaddr_in前,使用下面语句初始化一下
struct sockaddr_in server;
memset(&server, 0 , sizeof(server));
CodeJockey 2007-10-22
  • 打赏
  • 举报
回复
to ouyh12345:
服务器地址就是用的192.168.0.xxx,客户端向192.168.0.xxx和127.0.0.1发送两种方式我都试过了,结果都是一样的,我想问一下,把客户端和服务器放在本机和不同机器上,怎么会有这种差别呢?
ouyh12345 2007-10-22
  • 打赏
  • 举报
回复
用截包的程序(如sniffer)看一下,有没有连接上,即三次握手有没有成功
ip地址改一下,服务器用本机地址,如192.....,客户端向127.0.0.1发送

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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