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)的限制下,把它們排入隊列中。

 

 

 

發佈了45 篇原創文章 · 獲贊 32 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章