当前位置:  技术问答>linux和unix

关于socket编程中inet_ntoa的怪异问题

    来源: 互联网  发布时间:2017-01-04

    本文导语:  今天在研究socket编程的时候,应用inet_ntoa,发现了一个异常奇怪的问题, 描述如下: 在当前terminal里用阻塞方式打起socket,另一个termianl用telnet连接,然后在当前 terminal里面打印出连接的ip和port。 当前terminal的代码...

今天在研究socket编程的时候,应用inet_ntoa,发现了一个异常奇怪的问题, 描述如下:
在当前terminal里用阻塞方式打起socket,另一个termianl用telnet连接,然后在当前
terminal里面打印出连接的ip和port。
当前terminal的代码如下:

#include 
#include 
#include 
#include 

#define MYPORT 8888

int main()
{
  int sockid, newsockid;
  struct sockaddr_in ina;
  struct sockaddr dst;
  int len;
  char d[20];
  char *d1;

  if((sockid = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
        perror("socket");
        return -1;
  }

  ina.sin_family = AF_INET;
  ina.sin_port = htons(MYPORT);
  ina.sin_addr.s_addr = htonl(INADDR_ANY);
  bzero(&(ina.sin_zero), 8);

  if((bind(sockid, (struct sockaddr *)&ina, sizeof(struct sockaddr))) == -1)
  {
        perror("bind");
        return -1;
  }

  if((listen(sockid, 10)) == -1)
  {
        perror("listen");
        return -1;
  }

  if((newsockid = accept(sockid, &dst, &len)) == -1)
  {
        perror("accept");
        return -1;
  }

  d1 = inet_ntoa(((struct sockaddr_in *)&dst)->sin_addr);
  printf("got a connection from %s, port is %d, len is %dn", d1, ntohs(((struct sockaddr_in *)&dst)->sin_port), len);
  //printf("got a connection from %s, port is %d, len is %dn", inet_ntoa(((struct sockaddr_in *)&dst)->sin_addr), ntohs(((struct sockaddr_in *)&dst)->sin_port), len);

  //inet_ntop(AF_INET, &(((struct sockaddr_in *)&dst)->sin_addr), d, 20);
  //printf("got a connection from %s, port is %d, len is %dn", d, ntohs(((struct sockaddr_in *)&dst)->sin_port), len);
  return 0;
}

然后在另外一个窗口:telnet 127.0.0.1 8888

问题出现了,只有在我解注掉这一行代码的时候,
//printf("got a connection from %s, port is %d, len is %dn", inet_ntoa(((struct sockaddr_in *)&dst)->sin_addr), ntohs(((struct sockaddr_in *)&dst)->sin_port), len);
我才能得到正确的值:
got a connection from 127.0.0.1, port is 37448, len is 16
got a connection from 127.0.0.1, port is 37448, len is 16

否则无论如何,都不能得到正确的结果:
got a connection from 184.31.131.191, port is 1032, len is 16

但是我认为这两句话本身是等效的阿:
  d1 = inet_ntoa(((struct sockaddr_in *)&dst)->sin_addr);
  printf("got a connection from %s, port is %d, len is %dn", d1, ntohs(((struct sockaddr_in *)&dst)->sin_port), len);
  //printf("got a connection from %s, port is %d, len is %dn", inet_ntoa(((struct sockaddr_in *)&dst)->sin_addr), ntohs(((struct sockaddr_in *)&dst)->sin_port), len);

哪位大侠能帮助看一下~多多感谢~!


|
     int
     accept(int s, struct sockaddr * restrict addr,
 socklen_t * restrict addrlen);

     The argument addr is a result argument that is filled-in with the address
     of the connecting entity, as known to the communications layer.  The
     exact format of the addr argument is determined by the domain in which
     the communication is occurring.  A null pointer may be specified for addr
     if the address information is not desired; in this case, addrlen is not
     used and should also be null.  Otherwise, the addrlen argument is a
     value-result argument; it should initially contain the amount of space
     pointed to by addr; on return it will contain the actual length (in
     bytes) of the address returned.  This call is used with connection-based
     socket types, currently with SOCK_STREAM.


if((newsockid = accept(sockid, &dst, &len)) == -1)
==>
len = sizeof(dst);
if((newsockid = accept(sockid, &dst, &len)) == -1)


    
 
 

您可能感兴趣的文章:

  • socket inet_ntoa返回客户端地址字符串的问题!
  • andriod下java socket网络编程:java socket客户端服务端代码示例
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!
  • IOS开发之socket网络编程(基于SimpleNetworkStreams的c/s程序)
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • Linux c socket编程:简单的客户端(client)和服务端(server)实现
  • socket 编程时,write的写入的数据大于socket缓冲区,会有什么结果??
  • Linux下使用openssl api编程socket编程,为什么要编译啊?
  • 关于文件操作和Socket网络编程!
  • linux下socket编程问题!
  • socket编程 中的bind问题
  • socket编程--htons
  • 急!!请教关于linux socket编程的一个问题!!
  • 急!关于SOCKET编程,在线等待!
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • 多进程socket编程问题
  • 问一个socket编程问题,急~~~
  • 求教!为何在socket编程中调recv函数无法阻塞?
  • 请教一个socket编程问题
  • 求助!!linux下socket编程
  • socket编程,使用recvfrom()函数监听问题。
  • sco unix下socket编程的问题,请大家帮忙
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux socket问题。。怎样获得已帮定特定port的一个套接字socket
  • 关于socket概念的理解问题!
  • 你是否可以回答Socket的问题?数据先后问题
  • Socket的问题
  • socket accept问题,大家指教。
  • socket客户端程序的问题
  • 关于多网口socket通信的简单问题
  • fgets用在SOCKET流上的问题
  • linux socket fd 写阻塞问题
  • linux下用socket实现多进程间通信问题?
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • 请问socket方面的问题
  • 请教两个小问题:一个cgywin下使用vi的问题,另一个socket的问题
  • windows 与 linux socket 编程问题
  • 问个linux下raw socket的问题
  • Socket的问题?
  • 关于socket通讯的一个问题
  • socket read返回问题
  • 奇怪问题,关于Socket的!
  • C++ socket挂钩问题
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3