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

一、一个简单的时间获取客户端

#include "unp.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;
    char buff[MAXLINE+1];
    if(argc!=2)
        err_sys("inputerror");
    if((sockfd=socket(AF_INET,SOCK_STREAM, 0))<0)
        err_sys("socketerror");
    servaddr.sin_family=AF_INET;
    servaddr.sin_port=htons(PORT);
    if(inet_pton(AF_INET,argv[1], &servaddr.sin_addr)<=0)
        err_sys("ipaddress error");
    if(connect(sockfd,(struct sockaddr *)servaddr, sizeof(servaddr))<0)
        err_sys("connecterror");
    int nbyte;
    while((nbyte=read(sockfd,buff, MAXLINE))<0)
    {
        buff[nbyte]=0;
        if(fputs(buff,stdout)==EOF)
            err_sys("fputserror");
    }
    if(n<0)
        err_sys("readerror");
    exit(0);
}


1. read返回0,表示客户端正常关闭连接。

    read返回负值,表示连接发生错误。

2. 此时我们把read写在while循环内,因为我们无法确定服务器端传过来的数据多大,如果一次读不完,就需要多次读取。

3. Unix终止进程运行,总是关闭该进程打开的所有描述符。

4. 一个Unix函数中有错误发生,全局变量errno就会被置为一个指明该错误类型的正值。这些正值对于的枚举名通常在<sys/errno.h>中定义。值0不表示任何错误。

注意:这里说的Unix函数说的是Unix自身库的函数,不是用户自定义的函数。

注意:线程函数在发送错误时,不设置全局变量errno,而是把errno的值作为函数返回值返回给调用者。

5. 注意这里的servaddr表明的是服务端的地址。

 

二、 一个简单的时间获取服务端

#include "unp.h"
#define MAXLINE 1024
#define PORT 13
#define CONMAX 5
void err_sys(const char* s)
{
    fprintf(stderr, "%s\n",s);
    exit(1);
}
int main(int argc, char** argv)
{
    intlistenfd, connfd;
    structsockaddr_in servaddr;
    charbuff[MAXLINE+1];
    listenfd=socket(AF_INET, SOCK_STREAM, 0);
   
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.port=htona(PORT);
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
   
    bind(listenfd,(structsockaddr*) &servaddr, sizeof(servaddr));
   
    listen(listenfd, CONMAX);
   
    while(true)
    {
        connfd=accept(listenfd, (struct sockaddr*) NULL, NULL);
        write(connfd, buff, strlen(buff));
        close(connfd);
    }
}
// socket bind listen connect accept 涉及socket的这些函数正常情况下都返回0或者具体描述符,在错误情况下都返回-1,错误被记录在errno。
//这里就不做错误检查了。


1. 注意这里是单线程,单进程。一次只能处理一个客户。如果有两个客户几乎同时到达,则系统在最大数目(CONMAX)的限制下,把它们排入队列中。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值