学习笔记《实战Linux Socket编程》第八章 面向连接的协议──服务端

listen()
#include <sys/socket.h>
int listen(int s, int backlog)
 
参数:
s:用于监听的套接口
backlog:连接队列的长度
如果函数调用成功,返回0,否则返回-1,同时可在errno中查到错误原因.
backlog是在Linux内核中建立一个监听队列,指的是接到了连接请求,但无法立即处理,所以连接请求被挂起.
 
accept()
#include <sys/types.h>
#include <sys/socket.h>
int accept(int s, struct sockaddr *addr, int *addrlen)
 
参数:
s:用于监听的套接口
addr:用于接受客户套接口地址的地址结构
addrlen:指向接受套接口地址缓存最大长度的指针.这个参数既是输入参数也是输出参数,作为输入参数时它指定了addr的最大长度,作为输出参数时它表示地址的实际长度.
    如果调用成功返回0,失败返回-1,同时可在errno中查到错误原因.

server.c
#include  < stdio.h >

#include 
< unistd.h >

#include 
< stdlib.h >

#include 
< errno.h >

#include 
< string .h >

#include 
< sys / types.h >

#include 
< sys / socket.h >

#include 
< netinet / in .h >

#include 
< arpa / inet.h >

#include 
< netdb.h >

#include 
< time.h >



static   void  bail( const   char   * on_what)

{

    
if (errno != 0)

    
{

        fputs(strerror(errno), stderr);

        fputs(
":",stderr);

    }


    fputs(on_what, stderr);

    fputc(
' ', stderr);

    exit(
1);

}


int  main( int  argc,  char   * argv[])
{
    
int z;
    
char *srvr_addr = NULL;
    
char *srvr_port = "9099";
    
struct sockaddr_in adr_srvr;
    
struct sockaddr_in adr_clnt;
    socklen_t len_inet;
    
int s;
    
int c;
    
int n;
    time_t td;
    
char dtbuf[128];
    
    
if (argc >= 2)
    
{
        srvr_addr 
= argv[1];
    }
else
    
{
        srvr_addr 
= "127.0.0.1";
    }

    
    
if (argc >= 3)
        srvr_port 
= argv[2];
    
    s 
= socket(PF_INET, SOCK_STREAM, 0);
    
if (-1 == s)
        bail(
"socket()");
        
    memset(
&adr_srvr, 0sizeof(adr_srvr));
    adr_srvr.sin_family 
= AF_INET;
    adr_srvr.sin_port 
= htons(atoi(srvr_port));
    
if (strcmp(srvr_addr, "*"!= 0)
    
{
        adr_srvr.sin_addr.s_addr 
= inet_addr(srvr_addr);
        
if (adr_srvr.sin_addr.s_addr == INADDR_NONE)
            bail(
"bad address");
    }
else
    
{
        adr_srvr.sin_addr.s_addr 
= INADDR_ANY;
    }

    
    len_inet 
= sizeof(adr_srvr);
    z 
= bind(s, (struct sockaddr *)&adr_srvr, len_inet);
    
if (-1 == z)
        bail(
"bind()");
    
    z 
= listen(s, 10);
    
if (-1 == z)
        bail(
"listen()");
    
    
for (;;)
    
{
        len_inet 
= sizeof(adr_clnt);
        c 
= accept(s, (struct sockaddr *)&adr_clnt, &len_inet);
        
if (-1 == c)
            bail(
"accept()");
        
        time(
&td);
        n 
= (int)strftime(dtbuf, sizeof(dtbuf), 
                
"%A %b %d %H:%M:%S %Y ", localtime(&td));
        z 
= write(c, dtbuf, n);
        
if (-1 == z)
            bail(
"write()");
            
        close(c);
    }

    
return 0;
}
 
client.c
#include  < stdio.h >

#include 
< unistd.h >

#include 
< stdlib.h >

#include 
< errno.h >

#include 
< string .h >

#include 
< sys / types.h >

#include 
< sys / socket.h >

#include 
< netinet / in .h >

#include 
< arpa / inet.h >

#include 
< netdb.h >



static   void  bail( const   char   * on_what)

{

    
if (errno != 0)

    
{

        fputs(strerror(errno), stderr);

        fputs(
":",stderr);

    }


    fputs(on_what, stderr);

    fputc(
' ', stderr);

    exit(
1);

}


int  main( int  argc,  char   * argv[])
{
    
int z;
    
char *srvr_addr = NULL;
    
char *srvr_port = "9099";
    
struct sockaddr_in adr_srvr;
    
int len_inet;
    
int s;
    time_t td;
    
char dtbuf[128];
    
    
if (argc >= 2)
    
{
        srvr_addr 
= argv[1];
    }
else
    
{
        srvr_addr 
= "127.0.0.1";
    }

    
    
if (argc >= 3)
        srvr_port 
= argv[2];
    
    s 
= socket(PF_INET, SOCK_STREAM, 0);
    
if (-1 == s)
        bail(
"socket()");
        
    memset(
&adr_srvr, 0sizeof(adr_srvr));
    adr_srvr.sin_family 
= AF_INET;
    adr_srvr.sin_port 
= htons(atoi(srvr_port));
    adr_srvr.sin_addr.s_addr 
= inet_addr(srvr_addr);
    
if (adr_srvr.sin_addr.s_addr == INADDR_NONE)
        bail(
"bad address");
    
    len_inet 
= sizeof(adr_srvr);
    
    z 
= connect(s, (struct sockaddr *)&adr_srvr, (socklen_t)len_inet);
    
if (-1 == z)
        bail(
"connect()");
    
    z 
= read(s, &dtbuf, sizeof(dtbuf) - 1);
    
if (-1 == z)
        bail(
"read()");
    
    dtbuf[z] 
= 0;
    printf(
"Date & Time is:%s ", dtbuf);
    
    close(s);
    putchar(
' ');
    
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值