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

关于select系统调用的一道题

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

    本文导语:  有这么一道题: 编写:将从命令提示符处输入的字符串用TCP的方式送信到echo服务器,接受从服务器返回来的响应,并表示出来的客户端程序。 tcp-echoc 如下: $ ./tcp-echoc Usage: tcp-echoc dsthost dstport ./echoc 127.0.0.1 7 se...

有这么一道题:
编写:将从命令提示符处输入的字符串用TCP的方式送信到echo服务器,接受从服务器返回来的响应,并表示出来的客户端程序。 tcp-echoc
如下:
$ ./tcp-echoc
Usage: tcp-echoc dsthost dstport
./echoc 127.0.0.1 7
sendmsg> Hello!, this is test message
recvmsg> Hello!, this is test message
echo服务器:通过TCP/IP的端口号7来提供服务

下面是服务器端的代码(IPv4和IPv6地址都适用的):
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define SERVPORT 5000 /*服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */
#define BUFF_SIZE 1024

void main()
{
    int sockfd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */
    struct sockaddr_in6 my_addr; /* 本机地址信息 */
    struct sockaddr_in6 remote_addr; /* 客户端地址信息 */
    if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) == -1)
    {
        perror("socket创建出错!"); exit(1);
    }
    bzero(&my_addr, sizeof(my_addr));
    my_addr.sin6_family=AF_INET6;
    my_addr.sin6_port=htons(SERVPORT);
    my_addr.sin6_addr = in6addr_any;
    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_in6)) == -1)
    {
        perror("bind出错!");
        exit(1);
    }
    if (listen(sockfd, BACKLOG) == -1) {
        perror("listen出错!");
        exit(1);
    }
    while(1) {
        int sin_size = sizeof(struct sockaddr_in);  //sockaddr_in6
        char temp[INET6_ADDRSTRLEN];
        if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) {
            perror("accept出错");
            continue;
        }
        printf("received a connection from %sn", inet_ntop(AF_INET6, remote_addr.sin6_addr, temp, sizeof(temp)));
        if (!fork()) { /* 子进程代码段 */
            char buffer[BUFF_SIZE];
            int len = recv(client_fd, buffer, BUFF_SIZE, 0);

            while(len > 0)
            {
                if (send(client_fd, buffer, len, 0) == -1)
                {
                    perror("unable to send!");
                    close(client_fd);
                    exit(1);
                }
                len = recv(client_fd, buffer, BUFF_SIZE, 0);
            }
            close(client_fd);
            exit(0);
        }
        close(client_fd);
    }
}
请把上面程序改为下面形式,并且利用select(),poll()等系统调用,实现I/O复用,满足多客户端的程序 multi-tcp-echos
如下:
$ ./multi-tcp-echos
Usage: multi-tcp-echos port
./multi-tcp-echos 5000

原客户端的程序见 http://zhidao.baidu.com/question/164851602.html 

|
《UNIX网络编程》第6章,IO多路复用

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 哪位高手给个unix系统下C语言socket+fork()+select()的例子?
  • java命名空间javax.accessibility类accessiblestate的类成员方法: selected定义及介绍
  • 究竟怎么样取得的<select name="select_user" size="8" multiple>值
  • java命名空间javax.accessibility类accessiblestate的类成员方法: selectable定义及介绍
  • man select 结果返回 No manual entry for select
  • java命名空间javax.swing.tree类defaulttreeselectionmodel的类成员方法: selection定义及介绍
  • select <0时调用exit(0),为什么程序没有退出,而是继续执行select了?
  • java命名空间javax.swing.tree类defaulttreecellrenderer的类成员方法: selected定义及介绍
  • insert into select和select into的使用和区别介绍
  • java命名空间java.awt.event类itemevent的类成员方法: selected定义及介绍
  • JDBC里select sum和select返回的字段类型不一样
  • java命名空间javax.swing类defaultbuttonmodel的类成员方法: selected定义及介绍
  • sql代码:select database select all table
  • java命名空间javax.swing.text.html类html.tag的类成员方法: select定义及介绍
  • Oracle中select 1和select *的区别
  • java命名空间javax.swing.text.html类html.attribute的类成员方法: selected定义及介绍
  • jquery下拉select控件操作方法分享(jquery操作select)
  • java命名空间javax.swing.plaf.synth接口synthconstants的类成员方法: selected定义及介绍
  • INSERT INTO SELECT语句与SELECT INTO FROM语句的一些区别
  • java命名空间javax.sound.midi类shortmessage的类成员方法: song_select定义及介绍
  • select into 和 insert into select 两种表复制语句
  • java命名空间javax.swing类jfilechooser的类成员方法: cancel_selection定义及介绍
  • select into与insert into select 表复制语句学习实例


  • 站内导航:


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

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

    浙ICP备11055608号-3