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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值