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

请问关于socket的问题

    来源: 互联网  发布时间:2016-11-14

    本文导语:  在linux下,编写服务端程序8-s.c  和 客户端程序8-c.c 问题较多请各位多多包涵,在此先谢了 /*----------服务端程序8-s.c---*/头文件省去 #define SERVPORT 3333 #define BACKLOG  10 int main() {   int sockfd,client_fd;   /sock_fd:监...

在linux下,编写服务端程序8-s.c  和 客户端程序8-c.c 问题较多请各位多多包涵,在此先谢了
/*----------服务端程序8-s.c---*/头文件省去
#define SERVPORT 3333
#define BACKLOG  10
int main()
{
  int sockfd,client_fd;   /sock_fd:监听socket;client_fd:数据传输socket
  struct sockaddr_in my_addr;    /本机地址信息/
  struct sockaddr_in remote_addr; /客户端信息/
  int sin_size;

  if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
  {
    perror("sock创建失败");
    exit(1);
  }
  my_addr.sin_family=AF_INET;
  my_addr.sin_port=htons(SERVPORT);
  my_addr.sin_addr.s_addr=INADDR_ANY;
  bzero(&(my_addr.sin_zero),8);

  if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
   {
     perror("bind wrong");
     exit(1);
   }
   if(listen(sockfd,BACKLOG)==-1)
    {
      perror("listen wrong");
      exit(1);
    }
    while(1)
    {
      sin_size=sizeof(struct sockaddr_in);
    if((client_fd=accept(sockfd,(struct sockaddr *)&remote_addr,&sin_size))==-1)
      {
        perror("accept error");
      continue;
     } 
     printf("收到来自:%sn",inet_ntoa(remote_addr.sin_addr));
     if(!fork())    /创建子进程/
     {
       if(send(client_fd,"hello, worldn",14,0)==-1)
          perror("send wrong");
          close(client_fd);
          exit(0);
     }
     close(client_fd);
   }
}


对于服务端的程序问题是:
(1)my_addr.sin_addr.s_addr=INADDR_ANY;是这样赋值的呢?s_addr  INADDR_ANY分别代表什么意思呢?(因为struct socksddr_in{struct in_addr sin_addr;}并没有s_addr项,又或者说,我可以通过什么方式查询s_addr带表什么意思呢)
(2)为什么要现在子进程关闭socket即close(client_fd),接着又在父进程关闭sock即close(client_fd),也就是说为什么要关闭两次呢?
(3)为什么刚开始创建的socket即:sockfd不用关闭呢?

-----------------------------------------------------------------------------
/*-----客户端8-c.c--*/
#define SERVPORT 3333
#define MAXDATASIZE 100  /每次最多数据传输量/
int main(int argc,char *argv[])
{
  int sockfd,recvbytes;
  char buf[MAXDATASIZE];

  struct hostent *host;

  struct sockaddr_in serv_addr;
  if(argch_addr);
  bzero(&(serv_addr.sin_zero),8);
  if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
   {
     perror("connect error");
     exit(1);
   }
   if((recvbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1)
   {
     perror("connect wrong");
     exit(1);
   }
   buf[recvbytes]='';
   printf("收到:%s",buf);
   close(sockfd);
}


客户端的问题是:
(1)fprintf(stderr,"enter hostnamen") 此函数中 stderr是怎么确定的呢(我用man fprintf没有找到适合的答案)
(2) serv_addr.sin_addr=*((struct in_addr *)host->h_addr);为什么可以这么用呢?(和服务端程序的赋值有所不同)。
(3)定义了struct hostent *host,如果我想知道这个结构体的具体细节应该怎么查询呢(比如像函数那样 man  函数名)
(4)bzero(&(serv_addr.sin_zero),8);后面的8是不是凡是用到bzero函数的话就不变的呢?(因为strcut sockaddr_in{insig char sin_zero[8],我觉得是有这个[8]决定的})

|
对,父进程中没有使用client_fd,直接关闭了

|


查找 struct in_addr 的定义即可:
/* Internet address. */
struct in_addr {
__be32 s_addr; // be = big endian 字节序
};
INADDR_ANY 表示“Address to accept any incoming messages.”,也就是 任意地址

|
stderr就是标准错误句柄,通常是屏幕输出
绑定INADDR_ANY表示监听任意IP地址的包,包括环回接口127.0.0.1
bzero就是用0填充memset,后面的大小是跟你需要清零的内存大小有关的

从楼主的问题可以看出,楼主需要在所有的方面加强,这么多的问题,一下子问出来是没有效果的,因为你自己都没有备选答案,更加谈不上从回答中获取正确信息了

|
服务端的程序问题:
1、INADDR_ANY 表示任意可用地址,也就是说客户端可以通过服务器的任何一个地址来访问
2、父子进程地址空间独立,其中的client_fd是两个完全不相关的变量
3、sockfd不能关闭,因为还要继续监听新的请求

客户端的问题是:
1、stderr 是标准错误输出
2、3  man gethostbyname
4、bzero 就是用来清零内存的,长度参数根据实际场景而定
“我觉得是有这个[8]决定的”,嗯对√

    
 
 

您可能感兴趣的文章:

  • 请问如何判断从raw socket发出的包是哪个进程发送的?
  • 请问socket方面的问题
  • 请问,在linux下如何探测socket端口通不通啊?
  • 请问javaBean能不能进行非本机的socket连接
  • 请问有没有Linux下SOCKET服务端和客户端的接口函数!!
  • 请问哪里有socket的文档啊? iis7站长之家
  • 请问如何在服务器端获得 socket 断开的消息?
  • 请问关于socket客户端因事件启动新线程的问题.高手请进
  • 请问:SCO UNIX下SOCKET的recv返回-1,errno=9?在线等·····
  • 请问哪里有socket的文档啊?
  • 请问如何在linux下用gcc调试socket程序???
  • 请问可以在一个Servlet里使用多线程和SOCKET吗?
  • 高手啊,请问如何将BufferedImage转换为可以用SOCKET传输的数据
  • 请问linux写socket的客户端如何实现WSAAsyncSelect
  • 请问关于多线程SOCKET的问题
  • [求助]请问socket编程中send()函数可以发送整形数据吗?
  • 请问rmi通讯和socket通讯有什么优劣和异同?
  • 请问socket编程在linux下和在windows下有哪些差别?
  • 请问unix与window之间能否实现socket通信或者有什么方式可以通信?
  • 请问如何捕获linux c SOCKET中SEND的错误,请指教,谢谢!
  • 请问玩过SOLARIS的高手门,在不正常关机后,就不能启动到windows公用桌面了,只能在命令提示模式下了,请问怎么解决这个问题啊?急~!~!
  • 请问:在GCC里的C程序里的变量的声明是不是只能在前面,而且相同类型的变量的声明只能放在一起?如果不是,请问怎么样可以解决这个问题.
  • 请问linux下GUI开发的问题!
  • 请问一个奇怪的问题!
  • 非常急! 请问daemontools 在red hat 9下的安装问题? 在线等待
  • 请问安装zhcon,cxterm问题
  • 请问如何在一台单机上装VMware的网络访问问题?
  • 请问adduser的一个问题!
  • 请问在Jbuilder 7中, 做swing界面, 用JDK1.4,怎么解决中文显示问题?
  • 请问一个很菜的问题
  • 请问关于为redhat7.2设置多IP问题?急!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问:我知道路由器的telnet密码,但忘记了enable 密码,请问如何是好?
  • 请问那里有SYBASE的jbdb 2.0下载;jspsmartupload可以直接将文件上传到数据库,请问如何使用
  • 请问最新的reahat9.0是基于什么核心的?2.4?2.6?请问那里能下载?
  • 请问:请问哪里有关于linux基本操作命令讲解的资料下载,最好是幻灯片格式的.
  • 请问,我试图用#admintool&图形工具命令来安装sun workshop5.0,为什么进入的却是用户管理界面?请问具体该如何在solaris下安装应用软件
  • 请问在Redhat 9里,我从登录就是图形介面,请问如何在图形介面内进入命令行方式呢,谢谢
  • 请问:我在redhat下装了bochs-2.2.1-1.rpm,.装了后,想设置一下,但找不到bochsrc.fda.bxrc,请问这个文件在哪个曰录下啊。
  • 请问:在配置Qt时,很多文档都说在.profile,.login里加东西,但是我好像没有发现有这两个文件上,请问这些文件在哪个目录下啊
  • 请问各位大虾,小弟今天开始学jsp了,这学期我们有java课,所以已经下载了jdk(好象是1.2),请问我的98环境怎么配置jsp环境呀?我的jdk可以运行.java程序,别的我就不知道了....谢谢!
  • 主机是WIN2000,我用的是LUNIX,请问是否可以共享上网? 如果可以请问如何设置? 500分答谢,龟儿食言!
  • 请问出现fstab文件丢失该怎么修复呀?
  • 请问这个方法如何调用?
  • 请问在网页中打开的新窗口,如何让其居中。
  • 请问我该学什么了
  • (急)请问大侠,JDK怎么配置?
  • 请问机器升级后,编译为何出错?
  • 请问一下,汇编器as是否就是gas?
  • 我在linux中把 网卡删除了,请问如何将他安装?
  • 请问如何让DMA方式读取硬盘啊?
  • 请问vi文中的替换命令


  • 站内导航:


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

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

    浙ICP备11055608号-3