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

关于socket的一些问题

    来源: 互联网  发布时间:2016-09-20

    本文导语:  刚开始看socket,很疑惑。 下面这个程序是我在网上找的,但是在printf("server: got connection from %sn",inet_ntoa(their_addr.sin_addr)); 输出客户端的ip地址时报 段错误,注释掉这句就没有问题了,我用的Linux环境,请问是什么...

刚开始看socket,很疑惑。

下面这个程序是我在网上找的,但是在printf("server: got connection from %sn",inet_ntoa(their_addr.sin_addr));
输出客户端的ip地址时报 段错误,注释掉这句就没有问题了,我用的Linux环境,请问是什么原因啊。 
服务器代码: 
 
 #include  
  #include  
  #include  
  #include  
  #include  
  #include  
  #include  
  #include  
  #define MYPORT 3490  /* the port users will be connecting to */ 
  #define BACKLOG 10   /* how many pending connections queue will hold */ 
  main() 
  { 
    int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */ 
    struct sockaddr_in my_addr;  /* my address information */ 
    struct sockaddr_in their_addr; /* connector's address information */ 
    int sin_size; 
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { 
      perror("socket"); 
      exit(1); 
    } 
    my_addr.sin_family = AF_INET;     /* host byte order */ 
    my_addr.sin_port = htons(MYPORT);   /* short, network byte order */ 
    my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ 
    bzero(&(my_addr.sin_zero), 8);    /* zero the rest of the struct */ 
    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))  
          == -1) { 
      perror("bind"); 
      exit(1); 
    } 
    if (listen(sockfd, BACKLOG) == -1) { 
      perror("listen"); 
      exit(1); 
    } 
    while(1) { /* main accept() loop */ 
      sin_size = sizeof(struct sockaddr_in); 
      if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,  
          &sin_size)) == -1) { 
       perror("accept"); 
        continue; 
      } 
      printf("server: got connection from %sn",  
                       inet_ntoa(their_addr.sin_addr)); 
      if (!fork()) { /* this is the child process */ 
       if (send(new_fd, "Hello, world!n", 14, 0) == -1) 
          perror("send"); 
       close(new_fd); 
       exit(0); 
     } 
      close(new_fd); /* parent doesn't need this */ 
      while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */ 
    } 
  } 

=======
还有,请问大家哪里有比较好的讲解socket的资料,可以让初学者进行系统的学习来入门。

|
我用gcc -Wall编译楼主的代码,有这么一个警告:
warning: implicit declaration of function âinet_ntoaâ
warning: format â%sâ expects type âchar *â, but argument 2 has type âintâ
由于少了头文件,第一个警告说没有inet_ntoa的声明所以就采用默认声明,认为它返回int,结果就是按照int来取inet_ntoa的返回值并且送给printf
我的系统是64位的,指针是8个字节,int是4个字节,所以我运行的时候出现了段错误,加了头文件就没问题了。
如果是32位系统,指针和int都是4个字节,就不太清楚结果会怎么样了

|
少了个inet_ntoa的头文件,不知道是不是这个原因引起段错误,加上试试吧。
#include 

|
《Unix网络编程》

|

while(1)
      { /* main accept() loop */ 
      sin_size = sizeof(struct sockaddr_in); 
      if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,  
          &sin_size)) == -1)
      { 
       perror("accept"); 
        continue; 
      } //下面这句printf,在什么情况下会输出?
      printf("server: got connection from %sn",  
                       inet_ntoa(their_addr.sin_addr)); 
      
      if (!fork()) { /* this is the child process */ 
       if (send(new_fd, "Hello, world!n", 14, 0) == -1) 
          perror("send"); 
       close(new_fd); 
       exit(0); 
     } 
      close(new_fd); /* parent doesn't need this */ 
      while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */ 
    } 




printf()的地方不对。

accept会一直阻塞在那里,直到有client有请求并连接上为止,这个时候accept会返回

返回错误就打印错误信息执行perror,然后continue.

显然,这个地方当accept返回正确的时候,就会要printf()。所以这个printf的位置不对哈。

|
我在这个帖子上看到跟你差不多的代码 那人说有问题  可是我执行ok
http://bbs3.chinaunix.net/archiver/?tid-1757540.html

执行过程
[root@CentOS src]# ./client 127.0.0.1 hello
sent 5 bytes to 127.0.0.1

[root@CentOS src]# ./server
got packet from 127.0.0.1
packet is 5 bytes long
packet contains "hello"

|
由于少了头文件,第一个警告说没有inet_ntoa的声明所以就采用默认声明,认为它返回int,结果就是按照int来取inet_ntoa的返回值并且送给printf
-----------
如果是这样 将错就错  把printf里的%s改成%d   我估计不会报段错误了  会有什么效果啊?
楼主测试下试试?

    
 
 

您可能感兴趣的文章:

  • linux socket问题。。怎样获得已帮定特定port的一个套接字socket
  • 关于socket概念的理解问题!
  • socket编程 中的bind问题
  • 你是否可以回答Socket的问题?数据先后问题
  • 多进程socket编程问题
  • Socket的问题
  • socket accept问题,大家指教。
  • socket客户端程序的问题
  • 关于多网口socket通信的简单问题
  • fgets用在SOCKET流上的问题
  • linux socket fd 写阻塞问题
  • linux下用socket实现多进程间通信问题?
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • sco unix下socket编程的问题,请大家帮忙
  • 请问socket方面的问题
  • socket编程中的问题,请各位大侠指教!
  • 急!!请教关于linux socket编程的一个问题!!
  • socket编程,使用recvfrom()函数监听问题。
  • linux下socket编程问题!
  • 请教两个小问题:一个cgywin下使用vi的问题,另一个socket的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: gettrafficclass定义及介绍
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • java命名空间java.net类socket的类成员方法: getport定义及介绍
  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • java命名空间java.net类socket的类成员方法: getlocalport定义及介绍
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • java命名空间java.net类socket的类成员方法: getinetaddress定义及介绍
  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?
  • java命名空间java.net类socket的类成员方法: isconnected定义及介绍
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!


  • 站内导航:


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

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

    浙ICP备11055608号-3