转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> MySql >> 正文
Linux网络编程,第一部分:BSD套接口篇(上)         ★★★★

Linux网络编程,第一部分:BSD套接口篇(上)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1865 更新时间:2009/4/22 20:45:43
sp;       perror("gethostbyname()");
        exit(1);
    }

    (void) memset(&serverName, 0,
  sizeof(serverName));
    (void) memcpy(&serverName.sin_addr,
  hostPtr->h_addr,
  hostPtr->h_length);
     /*
      *h_addr是h_addr_list[0]的同义词,
      *    h_addr_list是一组地址的数组
      *长度为4(byte)代表一个IP地址的长度
      */
/*
 * 为了使服务器绑定本机所有的IP地址,
 * 上面一行代码需要用下面的代码代替
 * serverName.sin_addr.s_addr=htonl(INADDR_ANY);
 */

    serverName.sin_family = AF_INET;
    /* htons:h(host byteorder,主机字节序)
     *         to n(network byteorder,网络字节序
     *         s(short类型)
     */
    serverName.sin_port = htons(port);
/* 在一个地址(本例中的serverSocket)被建立后
 * 它就应该被绑定到我们获得的套接口。
 */
    status = bind(serverSocket,
 (struct sockaddr *) &serverName,
        sizeof(serverName));
    if (-1 == status)
    {
        perror("bind()");
        exit(1);
    }
/* 现在套接口就可以被用来监听新的连接。
 * BACK_LOG指定了未决连接监听队列(listen queue for pending connections)
 * 的最大长度。当一个新的连接到达,而队列已满的话,客户就会得到连接拒绝错误。
 * (这就是dos拒绝服务攻击的基础)。
 */
    status = listen(serverSocket, BACK_LOG);
    if (-1 == status)
    {
        perror("listen()");
        exit(1);
    }
/* 从这里开始,套接口就开始准备接受请求,并为他们服务。
 * 本例子是用for循环来达到这个目的。一旦连接被接受(accpepted),
 * 服务器可以通过指针获得客户的地址以便进行一些诸如记录客户登陆之类的
 * 任务。
    for (;;)
    {
        struct sockaddr_in clientName = { 0 };
        int slaveSocket, clientLength =
  sizeof(clientName);

        (void) memset(&clientName, 0,
  sizeof(clientName));

        slaveSocket = accept(serverSocket,
  (struct sockaddr *) &clientName,
  &clientLength);
        if (-1 == slaveSocket)
        {
            perror("accept()");
            exit(1);
        }

        childPid = fork();

        switch (childPid)
        {
        case -1: /* ERROR */
            perror("fork()");
            exit(1);

        case 0: /* child process */

            close(serverSocket);

            if (-1 == getpeername(slaveSocket,
  (struct sockaddr *) &clientName,
  &clientLength))
            {
                perror("getpeername()");
            }
            else
            {
            printf("Connection request from %s\n",
                    inet_ntoa(clientName.sin_addr));
            }

            /*
             * Server application specific code
             * goes here, e.g. perform some
             * action, respond to client etc.
             */
            write(slaveSocket, MESSAGE,
   strlen(MESSAGE));
              /* 也可以使用带缓存的ANSI函数fprint,
               * 只要你记得必要时用fflush刷新缓存
               */
            close(slaveSocket);
            exit(0);

        default: /* parent process */
            close(slaveSocket);/* 这是一个非常好的习惯
                                * 父进程关闭子进程的套接口描述符
                                * 正如上面的子进程关闭父进程的套接口描述符。
                                */                             
        }
    }

    return 0;
}

上一页  [1] [2] 


[C语言系列]C#网络编程客户端程序实现源码分享  [Web开发]JavaScript 面向对象编程, 第一部分: 继承
[MySql]值得关注的MySQL 4.1.1进展 (第一部分)  [MySql]Linux网络编程,第一部分:BSD套接口篇(下)(翻译)
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台