UNIX网络编程第4章4.5listen函数4.6accept函数

#include <time.h>
#include "../lib/unpsunyj.h"

// Daytime server that prints client IP address and port

int main(int argc, char **argv)
{
    int                 listenfd;
    int                 connfd;
    socklen_t           len;
    struct sockaddr_in  servaddr;
    struct sockaddr_in  cliaddr; // 它将存放客户的协议地址
    char                buff[MAXLINE];
    time_t              ticks;

    // listenfd = Socket(AF_INET, SOCK_STREAM, 0);
    if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        err_sys("socket error");

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family      = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port        = htons(13);   /* daytime server */

    //Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
    if (bind(listenfd, (sockaddr*)&servaddr, sizeof(servaddr)) < 0)
    {
        err_sys("bind error");
    }

    // Listen(listenfd, LISTENQ);
    if (listen(listenfd, LISTENQ) < 0)
    {
        err_sys("listen error");
    }

    for ( ; ; )
    {
        len = sizeof(cliaddr);
        // connfd = Accept(listenfd, (SA *) &cliaddr, &len);
again:
        if ((connfd = accept(listenfd, (sockaddr*)&cliaddr, &len)) < 0)
        {
#ifdef  EPROTO
            if (errno == EPROTO || errno == ECONNABORTED)
#else
                if (errno == ECONNABORTED)
#endif
                    goto again;
                else
                    err_sys("accept error");
        }

        const char  *ptr;
        if ((ptr = inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff))) == NULL)
            err_sys("inet_ntop error");     /* sets errno */

        printf("connection from %s, port %d\n",
                // Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),
                ptr,
                ntohs(cliaddr.sin_port));

        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
        // Write(connfd, buff, strlen(buff));
        int length = strlen(buff);
        if (write(connfd, buff, length) != length)
        {
            err_sys("write error");
        }

        // Close(connfd);
        if (close(connfd) == -1)
        {
            err_sys("close error");
        }
    }
}

时间: 2024-10-27 06:32:52

UNIX网络编程第4章4.5listen函数4.6accept函数的相关文章

UNIX 网络编程第五章读后有感

刚看完 UNIX 第五章内容,我想按照自己的方式将自己获得的知识梳理一遍,以便日后查看!先贴上一段简单的 TCP 服务器端代码: 1 #include <sys/socket.h> 2 #include <netinet/in.h> 3 #include <stdio.h> 4 #include <error.h> 5 #include <unistd.h> 6 #include <string.h> 7 #include <s

unix网络编程第四章----基于TCP套接字编程

为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议 #include<sys/socket.h> int socket(int family,int type,int protocol); family表示协议族,比如AF_INET,type表示套接字类型, protocol一般设置为0 family: AF_INET ipv4协议 type: SOCK_STREAM 字节流套接字 SOCK_DGRAM 数据报套接字 SOCK_RAW 原始套接字 pro

unix网络编程第2章

time_wait状态  可靠地实现tcp全双工连接的终止; (假设客户端先关闭).服务端再关闭,服务端将发送fin ,客户端此时进入time_wait状态.客户端接收到fin.将回一个ack.如果这个ack一旦丢失..time_wait这段时间,会使得服务端重新发送fin (2)使得老的重复分节在网络中消失,五元组相同 这个规则存在一个例外:如果到达的SYN的序列号大于前一化身的结束序列号,源自Berkeley的实现将给当前处于TIME_WAIT状态的连接启动新的化身(必须是服务端先关闭.因为

UNIX网络编程 第1章:简介和TCP/IP

1.1 按1.9节未尾的步骤找出你自己的网络拓扑的信息. 1.2 获取本书示例的源代码(见前言),编译并测试图1-5所示的TCP时间获取客户程序.运行这个程序若干次,每次以不同IP地址作为命令行参数. 1.3 把图1-5中的socket的第一参数改为9999.编译并运行这个程序.结果如何?找出对应于所输出出错的errno值.你如何可以找到关于这个错误的更多信息? socket error: Address family not supported by protocol 1.4 修改图1-5中的

UNIX网络编程第3章套接字编程简介3.2套接字地址结构3.3值结果参数3.4字节排序函数

1: #include <iostream> 2: #include "../lib/unpsunyj.h" 3: 4: int main(int argc, char **argv) 5: { 6: union { 7: short s; 8: char c[sizeof(short)]; 9: } un; 10:   11: un.s = 0x0103; 12: std::cout << "un.s =: " << un.s

UNIX网络编程第30章客户服务器程序设计范式 草稿

【Unix网络编程】chapter6 IO复用:select和poll函数

chapter6 6.1 概述 I/O复用典型使用在下列网络应用场合. (1):当客户处理多个描述符时,必须使用IO复用 (2):一个客户同时处理多个套接字是可能的,不过不叫少见. (3):如果一个TCP服务器既要处理监听套接字,又要处理已连接套接字. (4):如果一个服务器既要处理TCP,又要处理UDP (5):如果一个服务器要处理多个服务或多个协议 IO复用并非只限于网络,许多重要的应用程序也需要使用这项技术. 6.2 I/O模型 在Unix下可用的5种I/O模型的基本区别: (1)阻塞式I

UNIX网络编程1.1概述 1.2时间获取客户函数 1.4错误处理包裹函数

逻辑上socket处于应用层与传输层之间. ip,端口,协议,一起决定了网络的一个端点. #include <iostream> #include "unp.h" int main(int argc, char** argv) { int sockfd; int n; char recvline[MAXLINE + 1]; struct sockaddr_in servaddr; if (argc != 2) { err_quit("usage: a.out &l

Unix网络编程中的五种I/O模型_转

转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描述符.接受数据缓冲地址.大小传递给内核,但是如果此时 该与该套接口相应的缓冲区没有数据,这个时候就recvfrom就会卡(阻塞)在这里,知道数据到来的时候,再把数据拷贝到应用层,也就是传进来的地址空 间,如果没有数据到来,就会使该函数阻塞在那里,这就叫做阻塞I/O模型,如下图: 2. 非阻塞I/O模