linux下CS模型

/*server.c*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>

#include <signal.h>

#define SERVER_PORT 6666
#define MAX_BACKLOG_SIZE 10
#define MAX_MSG_LENGTH 1024

int server_connect(int * sockfd);
int server_recv(int sockfd, char * buf);
int server_send(int sockfd, const char * buf);
void signalhandler(void);

int main(int argc, char * argv[])
{
    signalhandler();
    int client_sockfd, server_sockfd;
    int sockfd = server_connect(&server_sockfd);
    if(sockfd != -1)
    {
        char buf[MAX_MSG_LENGTH] = {0};
        server_recv(sockfd, buf);
    }
    close(server_sockfd);
    return 0;
}

int server_connect(int * sockfd)
{
    int server_sockfd;
    int addrlen = MAX_MSG_LENGTH;
    struct sockaddr_in server_addr, client_addr;
    
    server_sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(server_sockfd == -1)
    {
        printf("server socket error: %s\n", strerror(errno));
        return -1;
    }
    
    memset(&server_addr, 0, sizeof(struct sockaddr_in));
    server_addr.sin_family      = AF_INET;
    server_addr.sin_port        = htons(SERVER_PORT);
    server_addr.sin_addr.s_addr = INADDR_ANY;
    int bind_ret = bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in));
    if(bind_ret == -1)
    {
        printf("server bind error: %s\n", strerror(errno));
        close(server_sockfd);
        return -1;
    }

    int listen_ret = listen(server_sockfd, MAX_BACKLOG_SIZE);
    if(listen_ret == -1)
    {
        printf("server listen error: %s\n", strerror(errno));
        close(server_sockfd);
        return -1;
    }

    memset(&client_addr, 0, sizeof(struct sockaddr));
    int client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_addr, &addrlen);
    if(client_sockfd == -1)
    {
        printf("server accept error: %s\n", strerror(errno));
        close(server_sockfd);
        return -1;
    }

    * sockfd = server_sockfd;
    return client_sockfd;
}

int server_recv(int sockfd, char * buf)
{
    do
    {
        int recvBytes = recv(sockfd, buf, MAX_MSG_LENGTH, 0);
        if(recvBytes == 0)
        {

            close(sockfd);
            printf("server disconnect!\n");
            return -1;
        }
        else if(recvBytes <= 0)
        {
            if(errno == EAGAIN)
            {
                sleep(1);
                continue;
            }
            else
            {
                close(sockfd);
                close(sockfd);
                printf("server recv error: %s\n", strerror(errno));
                return -1;
            }
        }
        printf("client msg: %s\n", buf);
        if(strcmp(buf, "exit") == 0)
        {
            close(sockfd);
            break;
        }
        memset(buf, 0, MAX_MSG_LENGTH);
    }while(1);

    return 0;
}

int server_send(int sockfd, const char * buf)
{
    int sendLength;
    do
    {
        sendLength = send(sockfd, buf, strlen(buf), 0);
        if(sendLength == 0)
        {
            close(sockfd);
            printf("server disconnect!\n");
            return -1;
        }
        else if(sendLength < 0)
        {
            if(errno == EAGAIN)
            {
                sleep(1);
                continue;
            }
            else
            {
                close(sockfd);
                printf("server send error: %s\n", strerror(errno));
                return -1;
            }
        }
        break;
    }while(1);

    return 0;
}


void signalhandler(void)  
{  
    sigset_t sigSet;
    sigemptyset(&sigSet);
    sigaddset(&sigSet, SIGINT); 
    sigaddset(&sigSet, SIGQUIT);
    sigaddset(&sigSet, SIGPIPE);
    sigprocmask(SIG_BLOCK, &sigSet, NULL);
}  


/*client.c*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define SERVER_PORT 6666
#define SERVER_IP   "192.168.137.3"
#define MAX_MSG_LENGTH 1024
 
int client_connect(void);
int client_send(int sockfd, const char * buf);
int client_recv(int sockfd, char * buf);

int main(int argc, char * argv[])
{
    char buf[MAX_MSG_LENGTH] = {0};
    int client_sockfd = client_connect();
    while((client_sockfd != -1))
    {
        gets(buf);
        client_send(client_sockfd, buf);
        if(strcmp(buf, "exit") == 0)
        {
            break;
        }
        memset(buf, 0, MAX_MSG_LENGTH);
    }
    close(client_sockfd);

    return 0;
}

int client_connect(void)
{
    int client_sockfd;
    client_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(client_sockfd < 0)
    {
        printf("client socket error: %s\n", strerror(errno));
        return -1;
    }

    int connect_ret;
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(struct sockaddr_in));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERVER_PORT);
    server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
    connect_ret = connect(client_sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in));
    if(connect_ret < 0)
    {
        printf("client connect error: %s\n", strerror(errno));
        close(client_sockfd);
        return -1;

    }

    return client_sockfd;
}

int client_send(int sockfd, const char * buf)
{
    int sendLength;
    do
    {
        sendLength = send(sockfd, buf, strlen(buf), 0);
        if(sendLength == 0)
        {
            close(sockfd);
            printf("client disconnect!\n");
            return -1;
        }
        else if(sendLength < 0)
        {
            if(errno == EAGAIN)
            {
                sleep(1);
                continue;
            }
            else
            {
                close(sockfd);
                printf("client send error: %s\n", strerror(errno));
                return -1;
            }
        }
        break;
    }while(1);

    return 0;
}

int client_recv(int sockfd, char * buf)
{
    do
    {
        int recvBytes = recv(sockfd, buf, MAX_MSG_LENGTH, 0);
        if(recvBytes == 0)
        {

            close(sockfd);
            printf("disconnect!\n");
            return -1;
        }
        else if(recvBytes <= 0)
        {
            if(errno == EAGAIN)
            {
                sleep(1);
                continue;
            }
            else
            {
                close(sockfd);
                printf("client recv error: %s\n", strerror(errno));
                return -1;
            }
        }
        printf("server msg: %s\n", buf);
        if(strcmp(buf, "exit") == 0)
        {
            close(sockfd);
            break;
        }
        memset(buf, 0, MAX_MSG_LENGTH);
    }while(1);

    return 0;
}

这个只是单对单的CS模型,可以在这个的基础上添加所需要的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值