linuxサーバプログラミング入門(一)最も簡単なlinuxサービスを実現する

5287 ワード

最も進んでlinuxのネットのプログラミングを学んで、いくつかノートをして、自分が忘れて印象を深めることを防止します.
 1.リスニングソケットの作成
/* 
1.        
       
int socket(int domain, int type, int protocol);
                      AF_INET,  ipv4
        socket  。           , TCP(SOCK_STREAM) UDP(SOCK_DGRAM)
    TCP SOCK_STREAM
          ,      。        。 0   

   :                   -1。
*/

コードは次のとおりです.
 int lfd = socket(AF_INET, SOCK_STREAM, 0);
 if(lfd == -1)
 {
      perror("socket error");
      exit(1);
 }

2.struct sockaddrを定義するinとローカルのIP portバインド
コードは次のとおりです.
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;    //       - ipv4
server.sin_port = htons(8888);//htons              ,                  htonl       htons    short  htonl    long 
server.sin_addr.s_addr = htonl(INADDR_ANY);   //INADDR_ANY           0.0.0.0

3.lfdとserverバインド
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//               
//                        (struct sockaddr*)
//       server   ,   struct sockaddr_in   
//      0     -1
 int ret = bind(lfd, (struct sockaddr*)&server, sizeof(server));
 if(ret == -1)
 {
     perror("bind error");
     exit(1);
 }

4.傍受の設定
//int listen(int sockfd, int backlog);

//sockfd                 
//backlog          
//    0     -1
ret = listen(lfd, 20);
if(ret == -1)
{
    perror("listen error");
    exit(1);
}

5.接続要求の待機および受信
//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//sockfd:      ,     listen()     。
//addr:(  )  ,      ,                  。Addr                       。
//addrlen:(  )  ,    ,  addr    ,    addr        。
//      0    -1
struct sockaddr_in client;
socklen_t len = sizeof(client);
int cfd = accept(lfd, (struct sockaddr*)&client, &len);  //cfd         
if(cfd == -1)
{
    perror("accept error");
    exit(1);
}

6.接続成功後にクライアント情報を印刷する
//const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
//        
//af     AF_INET
//src     ip  
//         dst 
//size dst   
//uint16_t ntohs(uint16_t netshort);
//        netshort        
//    
printf(" accept successful !!!
"); char ipbuf[64] = {0}; printf("client IP: %s, port: %d
", inet_ntop(AF_INET, &client.sin_addr.s_addr, ipbuf, sizeof(ipbuf)),ntohs(client.sin_port));

7.ループ受入情報
while(1)
    {
        //      
        char buf[1024] = {0};
        int len = read(cfd, buf, sizeof(buf));  //  read cfd    
        if(len == -1)   //  -1      
        {
            perror("read error");
            exit(1);
        }
        else if(len == 0)   //  0         
        {
            printf("            
"); close(cfd); break; } else // { printf("recv buf: %s
", buf); // - - for(int i=0; i

8.サービス側ソケットを閉じる
close(lfd);

完全なコードは次のとおりです.
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, const char* argv[])
{
    //         
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    if(lfd == -1)
    {
        perror("socket error");
        exit(1);
    }

    // lfd     IP port  
    struct sockaddr_in server;
    memset(&server, 0, sizeof(server));
    server.sin_family = AF_INET;    //       - ipv4
    server.sin_port = htons(8888);
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    int ret = bind(lfd, (struct sockaddr*)&server, sizeof(server));
    if(ret == -1)
    {
        perror("bind error");
        exit(1);
    }

    //     
    ret = listen(lfd, 20);
    if(ret == -1)
    {
        perror("listen error");
        exit(1);
    }

    //          
    struct sockaddr_in client;
    socklen_t len = sizeof(client);
    int cfd = accept(lfd, (struct sockaddr*)&client, &len);
    if(cfd == -1)
    {
        perror("accept error");
        exit(1);
    }

    printf(" accept successful !!!
"); char ipbuf[64] = {0}; printf("client IP: %s, port: %d
", inet_ntop(AF_INET, &client.sin_addr.s_addr, ipbuf, sizeof(ipbuf)), ntohs(client.sin_port)); // while(1) { // char buf[1024] = {0}; int len = read(cfd, buf, sizeof(buf)); if(len == -1) { perror("read error"); exit(1); } else if(len == 0) { printf("
"); close(cfd); break; } else { printf("recv buf: %s
", buf); // - - for(int i=0; i

クライアントは次のドキュメントを書きます.