Socket实现C/S架构的基本代码

14 篇文章 0 订阅

目录

 

Client端代码

Server端代码:

Server端多线程版本代码:


Client端代码

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(int argc, char **argv){

    int n = 0;
    char send_buffer[] = "Hello World";
    int send_size = sizeof(send_buffer);

    struct sockaddr_in server_addr;
    memset((void *)&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(8001);
	server_addr.sin_addr.s_addr = inet_addr("192.168.85.132");

    int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == sock_fd)
    {
        printf("Create socket err\n");
        return -1;
    }

    while(1)
    {
        if (connect(sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0)
        {
            printf("connect socket err\n");
            close(sock_fd);
            sleep(1);
            continue;
        }

        while(1)
        {
            n = send(sock_fd, send_buffer, send_size, 0);
            printf("send buffer size %d\n", n);
            sleep(3);
        }        
    }

out:
    if (-1 != sock_fd)
    {
        close(sock_fd);
        return -1;
    }
    return true;
}

Server端代码:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    int accept_fd = -1;
    socklen_t client_len = 0;
    int recv_len = 0;
    char recv_buffer[256];
    int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == sock_fd)
    {
        printf("Create socket err\n");
        return -1;
    }

    memset((void *)&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(8001);
	server_addr.sin_addr.s_addr = inet_addr("192.168.85.132");

    if (bind(sock_fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
        printf("Bind socket err\n");
        goto out;
    }

    while(1)
    {
        if (listen(sock_fd, 50) == -1)
        {
            printf("listen socket err\n");
            goto out;
        }

        accept_fd = accept(sock_fd, (struct sockaddr *) &client_addr, &client_len);
        if (accept_fd < 0)
        {
            printf("Accept socket err\n");
            goto out;
        }
        while(1)
        {
            recv_len = recv(accept_fd, recv_buffer, 256, 0);
            if (recv_len <= 0)
            {
                printf("recv socket err\n");
                goto out;
            }
            else
            {
                printf("recv len %d\n", recv_len);
            }            
        }
        close(accept_fd);
    }
out:
    if (-1 != sock_fd)
    {
        close(sock_fd);
        return -1;
    }
    return true;
}

Server端多线程版本代码:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <unistd.h>

#define MAX_THREAD_NUM 512
typedef struct thread_config_t
{
    pthread_t thread[MAX_THREAD_NUM];
    int index;
}thread_config_t;

typedef struct thread_args_t
{
    int accept_fd;
    int index;
}thread_args_t;

thread_config_t g_thread_config;

void *receive(void *args)
{
    char recv_buffer[256];
    int recv_len = 0;
    thread_args_t thread_args;
    memcpy((void *)&thread_args, (void *)args, sizeof(thread_args));
    while(1)
    {
        recv_len = recv(thread_args.accept_fd, recv_buffer, 256, 0);
        if (recv_len <= 0)
        {
            printf("recv socket err\n");
            break;
        }
        else
        {
            printf("recv fd %d len %d index %d\n", thread_args.accept_fd, recv_len, thread_args.index);
        }            
    }
    close(thread_args.accept_fd);
    printf("exit thread index %d\n", recv_len, thread_args.index);
}

int pthread_rcv(int accept_fd) {
    if (g_thread_config.index >= MAX_THREAD_NUM)
    {
        return -1;
    }
    thread_args_t thread_args;
    thread_args.accept_fd = accept_fd;
    thread_args.index = g_thread_config.index++;
	pthread_create(&g_thread_config.thread[thread_args.index], NULL, receive, (void*)&thread_args);	
	pthread_detach(g_thread_config.thread[thread_args.index]);

	return 0;
}

int main(int argc, char **argv)
{
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    int accept_fd = -1;
    socklen_t client_len = 0;

    
    int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == sock_fd)
    {
        printf("Create socket err\n");
        return -1;
    }

    memset((void *)&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(8001);
	server_addr.sin_addr.s_addr = inet_addr("192.168.85.132");

    if (bind(sock_fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
        printf("Bind socket err\n");
        goto out;
    }

    while(1)
    {
        if (listen(sock_fd, 50) == -1)
        {
            printf("listen socket err\n");
            goto out;
        }

        accept_fd = accept(sock_fd, (struct sockaddr *) &client_addr, &client_len);
        if (accept_fd < 0)
        {
            printf("Accept socket err\n");
            goto out;
        }
        printf("Accept socket %d\n", accept_fd);
        pthread_rcv(accept_fd);
    }
out:
    if (-1 != sock_fd)
    {
        close(sock_fd);
        return -1;
    }
    return true;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值