UNIX网络编程1.5一个简单的时间获取服务器程序1.6客户服务器程序索引表

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

int main(int argc, char ** argv)
{
    int         listenfd;
    int         connfd;
    sockaddr_in servaddr;
    char        buff[MAXLINE];
    time_t      ticks;

    // TCP套接字的创建
    // listenfd = Socket(AF_INET, SOCK_STREAM, 0);
    if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        err_sys("socket error");
    // 通过填写一个网际套接字地址结构并调用bind函数,服务器的众所周知端口(对于
    // 时间服务器是13)被捆绑到所创建的套接字。我们指定IP地址为INADDR_ANY,这样
    // 要是服务器主机有多个网络接口,服务器进程就可以在任意网络接口上接受客户连接
    // 以后我们将了解怎样限定服务器进程只在单个网络接口上接受客户连接。
    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, (struct sockaddr*) &servaddr, sizeof(servaddr));
    if (bind(listenfd, (sockaddr*)&servaddr, sizeof(servaddr)) < 0)
    {
        err_sys("bind error");
    }

    // 调用listen函数把该套接字换成一个监听套接字,这样来自客户的外来连接就可在该
    // 套接字上由内核接受。socket,bind,listen这3个调用步骤是任何TCP服务器准备所谓
    // 的监听描述符(listening descriptor,本例中为listenfd)的正常步骤
    // LISTENQ指定系统内核允许在这个监听描述符上排队的最大客户接连数。
    // Listen(listenfd, LISTENQ);

    char* ptr;
    /*4can override 2nd argument with environment variable */
    int listenq = LISTENQ;
    if ((ptr = getenv("LISTENQ")) != NULL)
    {
        listenq = atoi(ptr);
    }

    if (listen(listenfd, listenq) < 0)
    {
        err_sys("listen error");
    }

    // 接受客户连接,发送应答
    // 通常情况下,服务器进程在accept调用中被投入睡眠,等待某个客户连接的到达并
    // 被内核接受。TCP连接使用所谓的三路握手(three-way handshake)来建立连接。
    // 握手完毕时accept函数返回,其返回值是一个称为已连接描述符(connected
    // descriptor)的新描述符(本例中为connfd)。该描述符用于与新连接的那个客户通信
    // accept为每个连接到本服务器的客户返回一个新描述符。
    for ( ; ; )
    {
        // connfd = Accept(listenfd, (struct sockaddr*)NULL, NULL);
again:
        if ((connfd = accept(listenfd, (sockaddr*)NULL, NULL)) < 0)
        {
#ifdef  EPROTO
            if (errno == EPROTO || errno == ECONNABORTED)
#else
                if (errno == ECONNABORTED)
#endif
                    goto again;
                else
                    err_sys("accept error");
        }

        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
        // Write(connfd, buff, strlen(buff));
        int len = strlen(buff);
        if (write(connfd, buff, len) != len)
        {
            err_sys("write error");
        }
        // 服务器调用close关闭与客户的连接。该调用引发正常的TCP连接终止序列
        // Close(connfd);
        if (close(connfd) == -1)
        {
            err_sys("close error");
        }
    }
    return 0;
}

时间: 2024-10-08 02:49:00

UNIX网络编程1.5一个简单的时间获取服务器程序1.6客户服务器程序索引表的相关文章

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

简介(1)-概述、一个简单的时间获取客户程序

1.概述 大多数网络应用划分:客户(client)和服务器(server) 一些复杂的网络应用:异步回调通信,即服务器向客户发起请求消息. 协议栈:应用协议.TCP协议.IP协议.以太网协议 局域网(local area network,LAN),广域网(wide area network,WAN). 路由器是广域网的架构设备. 因特网:当今最大的广域网. POSIX:一种被多数厂商采纳的标准. 2.一个简单的时间获取客户程序 1)创建套接字 socket函数 2)指定服务器的IP地址和端口 s

一个简单的时间获取客户程序

程序执行流程: 1.创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0) 2.把结构体servaddr清零 bzero(&servaddr, sizeof(servaddr)) 3.置地址簇为AF_INET servaddr.sin_family = AF_INET 4.端口号设为13 网际套接字地址结构中IP地址和端口号这2个成员必须使用特定格式 htons主机到网络短整数,去转换二进制端口号 servaddr.sin_port   = htons(13

一个简单的时间获取服务器程序

程序执行流程: 1.创建TCP套接字 listenfd = Socket(AF_INET, SOCK_STREAM, 0) 2.清空sockaddr_in  servaddr结构体 bzero(&servaddr, sizeof(servaddr)) 3.填写网际套接字地址结构 我们指定IP地址为INADDR_ANY,这样要是服务器主机有多个网络接口,服务器进程就可以在任意网络接口上接受客户连接 servaddr.sin_family      = AF_INET; servaddr.sin_a

UNIX网络编程入门——TCP客户/服务器程序详解

前言 最近刚开始看APUE和UNP来学习socket套接字编程,因为网络这方面我还没接触过,要等到下学期才上计算机网络这门课,所以我就找了本教材啃了一两天,也算是入了个门. 至于APUE和UNP这两本书,书是好书,网上也说这书是给进入unix网络编程领域初学者的圣经,这个不可置否,但这个初学者,我认为指的是接受过完整计算机本科教育的研究生初学者,需要具有完整计算机系统,体系结构,网络基础知识.基础没打好就上来啃书反而会适得其反,不过对于我来说也没什么关系,因为基础课也都上得差不多了,而且如果书读

【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数

本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O复用适用于以下场合: (1) 当客户处理多个描述符(一般是交互式输入或网络套接字),必须适用I/O复用 (2) 当一个客户处理多个套接字时,这种情况很少见,但也可能出现 (3) 当一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般就要使用I/O复用 (4) 如果一个服务器既要适用TCP,

UNIX网络编程--简介(一)【转】

本文转载自:http://blog.csdn.net/yusiguyuan/article/details/11760187 一.概述 a) 在编写与计算机通信的程序时,首先要确定的就是和计算机通信的协议,从高层次来确定通信由哪个程序发起以及响应在合适产生.大多数网络应用按照划分成客户和服务器来组织.在设计网络应用时,确定总是由客户发起请求往往能够简化协议和程序本身.当然一个较为复杂的网络应用还需要异步回调通信,也就是由服务器向客户发起请求消息. i. 在本书原著上多次提到客户(client)和

Linux网络编程(简单的时间获取服务器)

1.一个简单的服务器时间获取程序 服务器和客户端采用UDP通信的方式,来编写一个简单的时间获取应用. 把过程大致理顺一下,首先是服务器端的编写,使用的是迭代的方式,没有并发 先创建一个socket而后bind服务器,绑定之后就可以创建一个循环来接收和发送 信息了,以达到和客户端之间的通信. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include

Unix网络编程学习笔记之第1章 简介

一.一个简单的时间获取客户端 #include <sys/socket.h> #define MAXCON 50 #define MAXLINE 1024 #define PORT 13 void err_sys(const char* s) { fprintf(stderr, "%s\n",s); exit(1); } int main(int argc, char** argv) { int sockfd; structsockaddr_in servaddr; cha