1. 程式人生 > >Linux 網路程式設計之一個簡單的客戶端伺服器程式

Linux 網路程式設計之一個簡單的客戶端伺服器程式

1、服務端

#include "includes.h"
#include <sys/types.h>          
#include <sys/socket.h>
#include <linux/in.h>

#define  SERVER_PORT 8888 //監聽的埠號
#define  MAX_BUFFER_LEN (256) //最大的buffer長度

void process_conn_server(int sock)
{
    char buf[MAX_BUFFER_LEN] = {0};
    int iRet = 0;

    printf("%s Enter\n", __func__);

    iRet = read(sock, buf, sizeof(buf));
    if (0 > iRet)
    {
        printf("read buf error\n");
        return ;
    }
    
    printf("read buf from client.\r\n");
    //讀取到的資訊寫到標準輸出
    write(1, buf, sizeof(buf));

    printf("%s Exit\n", __func__);
    return ;
}

int startServer()
{
    
    int iRet = ERROR;
    int sock_server = 0;
    int sock_client = 0;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr; 
    pid_t pid = 0;

    //1、建立一個socket
    sock_server = socket(AF_INET, SOCK_STREAM, 0);
    if (0 > sock_server)
    {
        printf("create socket error!\n");
        return ERROR;
    }
    //2、設定伺服器的地址
    bzero(&server_addr, sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = SERVER_PORT;

    //3、繫結地址到套接字描述符
    iRet = bind(sock_server, (const struct sockaddr *)&server_addr, sizeof(struct sockaddr));
    if( 0 > iRet)
    {
        printf("bind sock_server error\n");
        return iRet;
    }

    //4、設定監聽佇列
    iRet = listen(sock_server, 5);
    if(0 > iRet)
    {
        printf("sock_server listen error\n");
        return iRet;
    }

    //5、主迴圈處理客戶端請求
    while(1)
    {
        sock_client = accept(sock_server, (struct sockaddr *)&(client_addr), sizeof(client_addr) );
        if (0 > sock_client)
        {
            continue; //繼續監聽客戶端
        }
        // 6、建立一個新的程序處理client資料
        printf("recive the client DATA.\n");
        pid = fork();
        if (0 > pid)
        {
            printf("create process error\n");
            close(sock_client);
            continue;
        }
        else if(0 == pid)//子程序
        {
            close(sock_server);
            //處理
            process_conn_server(sock_client);
        }
        else // 父程序
        {
            close(sock_client);
        }
    }

    return iRet;
}

int main(int argc, char const *argv[])
{

    /* code */
    printf("come in server\n");
    startServer();
    return 0;
}

2、客戶端

#include "includes.h"
#include <sys/types.h>          
#include <sys/socket.h>
#include <linux/in.h>

#define  SERVER_PORT 8888 //監聽的埠號
#define MAX_BUFFER_LEN (256)

void process_conn_client(int sock)
{
    int size = 0;
    char buffer[MAX_BUFFER_LEN] = {0};

    while(1)
    {
        //從標準輸入讀取使用者輸入的資料
        size = read(0, buffer, sizeof(buffer));
        if (0 < size)
        {
            //將讀到的資訊傳送到伺服器
            printf("client read from output buffer:%s\n", buffer);
            write(sock, buffer, sizeof(buffer));
        }
    }
}

void startClient()
{
    int iRet = ERROR;
    int sock_server = 0;
    int sock_client = 0;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr; 

    printf("%s Enter\n", __func__);

    //1、建立一個socket
    sock_client = socket(AF_INET, SOCK_STREAM, 0); 
    if(0 > sock_client)
    {
        printf("create client socket error\n");
        return;
    }

    //2、設定客戶端地址
    bzero(&server_addr, sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = SERVER_PORT;
    inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);

    //3、連線伺服器
    connect(sock_client, (const struct sockaddr *)&server_addr, sizeof(struct sockaddr));

    //4、客戶端與伺服器進行通訊
    process_conn_client(sock_client);

    //5、關閉連線
    close(sock_client);

    printf("%s Exit\n", __func__);

    return;
}

int main(int argc, char const *argv[])
{

    /* code */
    printf("come in client\n");

    startClient();

    return 0;
}