• TCP库的应用——排序


    client.c

    #include"my_sort.h"  //my_sort 放在include中,里面包含my_socket.h
    #define MY_IP "127.0.0.1"
    #define MY_PORT 6666
    #define SER_IP "127.0.0.1"
    #define SER_PORT 8888
    int main()
    {
    srand(getpid());
    int arr[20];
    int fd_client;
    int len;
    my_socket(&fd_client,MY_TCP,MY_IP,MY_PORT);//绑定自己的
    arr_init(arr,20);//用my_sort.c的函数初始化
    printf("before: ");
    arr_show(arr,20);
    printf("connecting... ");
    SA server_addr;
    server_addr.sin_family=AF_INET;
    server_addr.sin_port=htons(SER_PORT);
    server_addr.sin_addr.s_addr=inet_addr(SER_IP);
    my_connect(fd_client,(pSA)&server_addr,sizeof(SA));
    printf("connect success! ");
    my_send(&len,fd_client,arr,80);//将数组发送过去
    my_recv(&len,fd_client,arr,80);//接收处理好的数组
    printf("after: ");
    arr_show(arr,20);
    return 0;
    }

    server.c

    #include"my_sort.h"
    #define IP "127.0.0.1"
    #define PORT 8888
    int main()
    {
    int fd_server,fd_client;
    int arr[20];
    int len;
    my_socket(&fd_server,MY_TCP,IP,PORT);
    my_listen(fd_server,10);
    my_accept(&fd_client,fd_server,NULL,NULL);
    printf("a client on! ");
    my_recv(&len,fd_client,arr,80);//接收客户端的数据
    printf("before: ");
    arr_show(arr,20);
    quick_sort(arr,20);//调用my_soet.c的快速排序函数
    printf("after: ");
    arr_show(arr,20);
    my_send(&len,fd_client,arr,80);//处理好后发送给客户端
    return 0;
    }

    my_sort.c

    #include "my_sort.h"
    void arr_init(int* arr, int len)
    {
    int index ;
    for(index = 0 ; index < len; index ++)
    {
    arr[index] = rand() % 1000 ;
    }
    }


    void arr_show(int* arr, int len)
    {
    int index ;
    for(index = 0 ; index < len; index ++)
    {
    printf("%4d", arr[index]);
    }
    printf(" ");
    }

    插入排序
    void insert_sort(int* arr, int len)
    {
    int pos , index ;
    int key ;
    for(pos = 1 ; pos < len; pos ++)
    {
    key = arr[pos] ;
    for(index = pos - 1 ; index >= 0; index --)
    {
    if(arr[index] < key)
    {
    break ;
    }else
    {
    arr[index + 1] = arr[index] ;
    }
    }
    arr[index + 1] = key ;
    }
    }
    static void swap(int* left, int* right)
    {
    int tmp = *left ;
    *left = *right ;
    *right = tmp ;
    }

    //快速排序
    void quik_sort(int* arr, int len)
    {
    if(len < 10)
    {
    int pos , index ;
    int key ;
    for(pos = 1 ; pos < len; pos ++)
    {
    key = arr[pos] ;
    for(index = pos - 1 ; index >= 0; index --)
    {
    if(arr[index] < key)
    {
    break ;
    }else
    {
    arr[index + 1] = arr[index] ;
    }
    }
    arr[index + 1] = key ;
    }

    }else
    {
    int k ;
    k = partion(arr, len);//0 - k-1(< key) k(key) (k+ 1 - len -1) (>= key)
    quik_sort(arr, k);
    quik_sort(arr + k + 1, len - k - 1);
    }
    }

    方法1
    int partion(int* arr, int len)
    {
    int key = arr[0] ;
    int low, high ;
    low = 0 ;
    high = len - 1 ;
    while(low < high)
    {
    while(low < high && arr[high] >= key )
    {
    high -- ;
    }
    if(low >= high)
    {
    break ;
    }else
    {
    swap(&arr[low], &arr[high]);
    }
    while(low < high && arr[low] < key)
    {
    low ++ ;
    }
    if(low < high)
    {
    swap(&arr[low], &arr[high]);
    }

    }
    return low ;
    }

    方法2 快慢指针

    #include "my_sort.h"
    int partion2(int *arr,int len)
    {
    int fast,last,key;
    last=0;
    fast=1;
    key=arr[0];
    for(;fast<len;fast++)
    {
    if(arr[fast]<key)
    {
    swap(&arr[last+1],&arr[fast]);
    last++;
    }
    }
    swap(&arr[0],&arr[last]);
    return last;
    }

    上面的三个文件都包含#include "my_sort.h"

    我们来看看my_sort.h

    #include"my_socket.h"
    void arr_init(int* arr,int len);
    void arr_show(int* arr,int len);
    void insert_sort(int* arr,int len);
    static void swap(int* left,int* right);
    void quick_sort(int* arr,int len);
    int partion(int* arr,int len);

    原来它里面已经包含my_socket.h

    那就追踪看看my_socket.h

    #ifndef __MY_SOCKET_H__
    #define __MY_SOCKET_H__
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #define IN
    #define OUT
    #define IN_OUT
    #define MY_TCP 1
    #define MY_UDP 2
    typedef struct sockaddr* pSA ;
    typedef struct sockaddr_in SA ;
    #define MY_ASSERT(flag,msg) ( (flag) ? NULL : ( fprintf(stdout,msg), exit(EXIT_FAILURE) ) )   // NULL代表什么也不做
    
    void my_socket(OUT int *local_sfd, int protocal, char *local_ip, int local_port);
    void my_listen(int local_sfd, int backlog);
    void my_accept(OUT int *peer_sfd, int local_sfd, OUT pSA peer_addr, IN_OUT int *addr_len );
    void my_connect(int local_sfd, pSA peer_addr, int addr_len);
    void my_recv(OUT int *recv_len, int peer_sfd, IN_OUT void *base, int len);
    void my_send(OUT int *send_len, int peer_sfd, void *base, int len);
    void my_recvfrom(OUT int *recvfrom_len, int peer_sfd, IN_OUT void *base, int len, OUT pSA peer_addr, IN_OUT int *addr_len);
    void my_sendto(OUT int *sendto_len, int peer_sfd, OUT void *base, int len,  pSA peer_addr, int addr_len);
    void my_close(int sfd);
    #endif

    //编译
    gcc -o c client.c my_sort.c -l my_socket -I /tmp/include
    gcc -o s server.c my_sort.c -l my_socket -I /tmp/include

    //运行结果如下


  • 相关阅读:
    有关位域的理解和说明
    LINUX 循环fork()
    关于Linux平台malloc的写时拷贝(延迟分配)【转】
    字符串常量到底存放在哪个存储区[转]
    linux下安装eclipse
    安装和布署项目
    linux 的 samba 实现共享文件夹
    php protobuff 使用
    MFC 配合 protobuff libevent 实现的Socket 的GM工具 框架
    php 学习使用
  • 原文地址:https://www.cnblogs.com/hxjbc/p/3953257.html
Copyright © 2020-2023  润新知