首页 > 技术文章 > TCP编程:内核缓存 与 读写缓存控制

ducong 2017-03-10 17:26 原文

内核缓存控制,读写缓存阻塞大小。默认8K。 通过10k内核缓存控制,观察读写缓存变化。还有 内核缓存设置的时机,需要在listen之前,这是基于tcp的三次握手syn同步确认内核缓存大小。

服务器端:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#define MAXLINE 4096
int main(int argc, char** argv){
    int    listenfd, acceptfd;
    struct sockaddr_in     servaddr;
    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
        printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
        return -1;
    }

    int nRecvBuf=10*1024; //设置为64K
    if(setsockopt(listenfd,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int))){

        printf("setsockopt error:%s(errno:%d)\n",strerror(errno),errno);
    }
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(6666);
    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
        printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
        return -1;
    }

    if( listen(listenfd, 10) == -1){
        printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
        return -1;
    }
    printf("======waiting for client's request======\n");
    if( (acceptfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){
        printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
    }else{
        printf("accept succ\n");
        int rcvbuf_len;
        socklen_t len = sizeof(rcvbuf_len);




        if( getsockopt(acceptfd, SOL_SOCKET, SO_RCVBUF, (void * )&rcvbuf_len, &len ) < 0 ){
            perror("getsockopt: " );
        }
        printf("the recv buf len: %d\n" , rcvbuf_len );
    }
    char recvMsg[246988]={0};
    ssize_t totalLen = 0;
    while (1) {
        sleep(1);
        ssize_t readLen = read(acceptfd, recvMsg, sizeof(recvMsg));
        printf("readLen:% ld\n",readLen);
        if (readLen < 0) {
            perror("read: ");
            return -1;
        }
        else if (readLen == 0) {
            printf("read finish: len = % ld\n",totalLen);
            close(acceptfd);
            return 0;
        }
        else{
            totalLen += readLen;
        }
    }
    close(acceptfd);
    return 0;
}

客户端:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#define MAXLINE 4096

int main(int argc, char** argv){
    int   connfd, n;
    char  recvline[4096], sendline[4096];
    struct sockaddr_in  servaddr;

    if( argc != 2){
        printf("usage: ./client <ipaddress>\n");
        return 0;
    }

    if( (connfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
        printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
        return 0;
    }

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(6666);
    if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
        printf("inet_pton error for %s\n",argv[1]);
        return 0;
    }

    if(connect(connfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
        printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
        return 0;
    }

    ssize_t writeLen;
    char sendMsg[246988] = {0};
    int count = 0;
    while (1){
        count++;
        if (count == 5) {
            return 0;
        }
        writeLen = write(connfd, sendMsg, sizeof(sendMsg));
        if (writeLen < 0) {
            printf("write failed\n");
            close(connfd);
            return 0;
        }
        else{
            printf("write sucess, writelen:%d\n",writeLen);
        }
    }
    close(connfd);
    return 0;
}

 

推荐阅读