文档章节

〇、linux网络内核调优:测试代码

for。
 for。
发布于 2016/07/23 09:55
字数 436
阅读 38
收藏 1

测试代码为一个简单的回显程序

客户端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define MAXLINE 4096
#define PORT 9000
#define HOST "0.0.0.0"

int bind_listen()
{
    int                 listenfd;
    struct sockaddr_in  servaddr;

    if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        return -1;
    }

    memset(&servaddr, 0x00, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    if (inet_pton(AF_INET, HOST, &servaddr.sin_addr) == -1) {
        close(listenfd);
        perror("inet_pton");
        return -1;
    }

    if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
        close(listenfd);
        perror("bind");
        return -1;
    }

    if (listen(listenfd, 20) == -1) {
        close(listenfd);
        perror("listen");
        return -1;
    }

    return listenfd;
}

void do_something(int sockfd)
{
    int     recvlen;
    char    buf[MAXLINE];

    while ((recvlen = read(sockfd, buf, MAXLINE)) > 0) {
        if (write(sockfd, buf, recvlen) < 0) {
            perror("write");
            return;
        }
    }

    if (recvlen == -1) {
        perror("read");
    } else if (recvlen == 0) {
        fprintf(stderr, "read EOF\n");
    }
}

int main(int argc, char **argv)
{
    int         listenfd, connfd;
    char        straddr[INET_ADDRSTRLEN];
    socklen_t   cliaddrlen;
    struct sockaddr_in  cliaddr;

    if ((listenfd = bind_listen()) == -1) {
        fprintf(stderr, "bind_listen error");
        exit(EXIT_FAILURE);
    }

    while (1) {
        cliaddrlen = sizeof(cliaddr);
        connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddrlen);
        if (connfd == -1) {
            perror("accept");
            continue;
        }

        fprintf(stderr, "connect from %s at PORT %d\n",
                inet_ntop(AF_INET, &cliaddr.sin_addr, straddr, sizeof(straddr)),
                ntohs(cliaddr.sin_port));

        do_something(connfd);

        close(connfd);
        fprintf(stderr, "close connfd\n");
    }

    return 0;
}

服务端

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define MAXLINE 4096
#define PORT 9000

int connect_server(const char *straddr)
{
    int     sockfd;
    struct sockaddr_in  servaddr;

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        return -1;
    }

    memset(&servaddr, 0x00, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    if (inet_pton(AF_INET, straddr, &servaddr.sin_addr) == -1) {
        perror("inet_pton");
        return -1;
    }

    if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
        close(sockfd);
        perror("connect");
        return -1;
    }

    return sockfd;
}

void do_something(int sockfd)
{
    char    sendbuf[MAXLINE], recvbuf[MAXLINE];
    int     sendlen, recvlen;

    while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL) {

        sendlen = strlen(sendbuf);
        if (write(sockfd, sendbuf, sendlen) == -1) {
            perror("write");
            return;
        }

        if ((recvlen = read(sockfd, recvbuf, sizeof(recvbuf)-1)) < 0) {
            perror("read");
            return;
        } else if(recvlen == 0) {
            fprintf(stderr, "str_cli: read EOF\n");
            return;
        }

        recvbuf[recvlen] = '\0';

        fputs(recvbuf, stdout);
    }
}

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

    if (argc != 2) {
        fprintf(stderr, "usage: tcpcli <IPaddress>\n");
        return 0;
    }

    sockfd = connect_server(argv[1]);
    if (sockfd == -1) {
        fprintf(stderr, "connect_server %s error\n", argv[1]);
        exit(EXIT_FAILURE);
    }

    do_something(sockfd);

    close(sockfd);
    fprintf(stderr, "close sockfd\n");

    return 0;
}

© 著作权归作者所有

共有 人打赏支持
for。

for。

粉丝 84
博文 47
码字总数 18257
作品 0
深圳
程序员
linux+Oracle集群课程全面升级

作为国内最早从事开源架构师级课程研发的公司,从2006年10月开始,荣新稳步提升,将互联网运维作为主导就业方向,并将Linux集群架构课程发展成为国内最顶级、覆盖技术最全面的Linux课程,作为...

张琦
06/26
0
0
Linux未来监控tracing框架——eBPF

eBPF源于早年间的成型于 BSD 之上的传统技术 BPF(Berkeley Packet Filter)。BPF 的全称是 Berkeley Packet Filter,顾名思义,这是一个用于过滤(filter)网络报文(packet)的架构。 BPF 是在 ...

binarydady
05/07
0
0
HDNL性能调优(4)故障点分析与工具准备

为深入调查系统运行状况,我们从CPU、内存、磁盘I/O等方面对各服务器的运行情况进行了指标收集和分析,具体情况如下: 为保证调优结果必须体现在迭代测试的过程中,我们对故障点的诊断采用了...

晨曦之光
2012/03/09
0
0
我的Java后端书架 (2018年暖冬版)

本书架主要针对Java后端开发与架构。 更新记录:4.0版把第五部份-具体技术的书整块拿掉了。《TCP/IP详解 卷1:协议》出到了第二版,增加《SRE:Google运维解密》,《Java8 实战》。 更偏爱那...

欧阳海阳
08/20
0
0
linux系统调优-存储(内存、硬盘)

首先一个基本概念: 存储系统存储速度的快->慢: 内存->闪存->磁盘 因为内存的价格限制以及操作系统支持的限制,我们只能从磁盘这块来看,可见磁盘正是存储系统的最大瓶颈所在。 **下面具体提...

月黑风高杀人夜
2015/08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
53分钟前
3
0
现场看路演了!

HiBlock
昨天
8
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
6
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
6
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部