linux c++ 服务器编程,收藏一个测试例子

// server
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>
#include"time.h"

#define  SERVER_PORT 10000
#define  MAX_BUF_SIZE  16
#define  SUCCESS 0
#define  FAILURE -1

int RecvFromServer(int iClientSockFd);

int main(int argc, char **argv)
{
    int iServerSockFd;
    int iClientSockFd;
    struct sockaddr_in stServerAddr;
    struct sockaddr_in stClientAddr;
    int iServerLen;
    int iClientLen;
    int iOpt =1;
    int iReturn;
    pid_t  pid;

    // time
    time_t timer;
    struct tm  *tblock;
    timer = time(NULL);
    tblock= localtime(&timer);
    printf("servertime is %s",asctime(tblock));

    printf("This is the Server.\n");
    printf("I am waiting the client to rsync time \n");

    // create server socket
    iServerSockFd = socket(AF_INET, SOCK_STREAM, 0);
    if (iServerSockFd < 0)
    {
        printf("socket create failed in CommManageServerRecvThread.\n");
    return FAILURE;
    }
    stServerAddr.sin_family = AF_INET;
    stServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    stServerAddr.sin_port = htons(SERVER_PORT);
    iServerLen = sizeof(stServerAddr);

    // bind socket
    iReturn = bind(iServerSockFd, (struct sockaddr *)&stServerAddr, iServerLen);
    if (iReturn < 0)
    {
    printf("socket bind failed in CommManageServerRecvThread.\n");

    }

    setsockopt(iServerSockFd,SOL_SOCKET,SO_REUSEADDR,&iOpt,sizeof(iOpt));

    // listen socket
    iReturn = listen(iServerSockFd, 10);

    // accept request from client
    while(1)
    {
    iClientSockFd = accept(iServerSockFd, (struct sockaddr*)&stClientAddr, (unsigned *)&iClientLen);
    if (iServerSockFd < 0)
    {
        printf("accept failed.\n");

    }
    pid = fork();
    switch(pid)
    {
        case -1:
        {
            printf("fork failed.\n");
            break;
        }
        case 0:
        {
           write(iClientSockFd,asctime(tblock),30);
           printf("child service ok!!\n");
           close(iClientSockFd);
           break;
        }
        default:
        {
            close(iClientSockFd);
            break;
        }
    }

    }

    close(iClientSockFd);

    close(iServerSockFd);

    return SUCCESS;
}

int RecvFromServer(int iClientSockFd)
{
    char acBuf[MAX_BUF_SIZE];
    int iReadNum;

    memset(acBuf, 0, sizeof(acBuf));

    iReadNum = recv(iClientSockFd, acBuf, 0xFFFF, 0);
    if(iReadNum < 0)
    {
        printf("read failed.\n");
        return FAILURE;
    }

    printf("Receive form client:\n");
    printf("%s\n", acBuf);

    return SUCCESS;
}

// client
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>

#define  SERVER_PORT 10000
#define  SERVER_IP   "192.168.0.112"
#define  WRITE_BUF_SIZE  1024

#define  SUCCESS 0
#define  FAILURE -1
char acBuf[WRITE_BUF_SIZE];

int my_read(int fd,void *buffer,int length)
{
         int bytes_left;
         int bytes_read;
         char *ptr;
         bytes_left=length; 

         ptr=buffer;

         while(bytes_left>0)
         {
            bytes_read=read(fd,ptr,bytes_left);
            if(bytes_read<0)
                 {
                  if(errno==EINTR)
                      bytes_read=0;
                  else
                      return -1;
                  }
            else
               if(bytes_read==0)
                     break;
              bytes_left -= bytes_read;
              ptr+=bytes_read;
          }
          return(length-bytes_left);
}

int main(int argc, char **argv)
{
    int iSockFd;
    int iReadNum;

    struct sockaddr_in stServerAddr;
    struct sockaddr_in stClientAddr;
    int iServerLen;
    int iClientLen;
    int iReturn;

    printf("This is the client.\n");

    // create server socket
    iSockFd = socket(AF_INET, SOCK_STREAM, 0);
    if (iSockFd < 0)
    {
        printf("socket create failed in CommManageServerRecvThread.\n");
        return FAILURE;
    }
    stServerAddr.sin_family = AF_INET;
    inet_pton(AF_INET, SERVER_IP, &stServerAddr.sin_addr);
    stServerAddr.sin_port = htons(SERVER_PORT);

    iServerLen = sizeof(stServerAddr);

    while(1)
    {
        //printf("try to connect to the server... ...\n");
        iReturn = connect(iSockFd, (const struct sockaddr *)&stServerAddr, iServerLen);
        if(iReturn >= 0)
        {
            break;
        }

        sleep(3);
    }

    printf("connect SUCCESS.\n");

    memset(acBuf, 0, sizeof(acBuf));

    my_read(iSockFd, acBuf, 30);

    printf("%s\n",acBuf);

    close(iSockFd);

    return SUCCESS;
}

时间: 2024-10-11 16:50:43

linux c++ 服务器编程,收藏一个测试例子的相关文章

Linux下socket编程,附带tcp例子

1.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用(Solaris门和Sun RPC) 但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问

Linux高性能服务器编程——I/O复用

 IO复用 I/O复用使得程序能同时监听多个文件描述符,通常网络程序在下列情况下需要使用I/O复用技术: 客户端程序要同时处理多个socket 客户端程序要同时处理用户输入和网络连接 TCP服务器要同时处理监听socket和连接socket,这是I/O复用使用最多的场合 服务器要同时处理TCP请求和UDP请求.比如本章将要讨论的会社服务器 服务器要同时监听多个端口,或者处理多种服务. I/O复用虽然能同时监听多个文件描述符,但它本身是阻塞的.并且当多个文件描述符同时就绪时,如果不采用额外措施

Linux高性能服务器编程——多线程编程(下)

多线程编程 条件变量 如果说互斥锁是用于同步线程对共享数据的访问的话,那么条件变量则是用于线程之间同步共享数据的值.条件变量提供了一种线程间的通信机制:当某个共享数据达到某个值得时候,唤醒等待这个共享数据的线程. 条件本身是由互斥量保护的.线程在改变条件状态前必须首先锁住互斥量,其他现成在获得互斥量之前不会察觉到这种变化,因为必须锁住互斥量以后才能计算条件. 条件变量的相关函数主要有如下5个: #include <pthread.h> int pthread_cond_destroy(pthr

Linux高性能服务器编程——定时器

 定时器 服务器程序通常管理着众多定时事件,因此有效组织这些定时事件,使之能在预期的时间点被触发且不影响服务器的主要逻辑,对于服务器的性能有着至关重要的影响.位置我们要将每个定时事件封装成定时器,并使用某种容器类型的数据结构,比如链表.排序链表和时间轮将所有定时器串联起来,以实现对定时事件的统一管理. Linux提供三种定时方法: 1.socket选项SO_RECVTIMEO和SO_SNDTIMEO. 2.SIGALRM信号 3.I/O复用系统调用的超时参数 socket选项SO_RCVTI

Linux 高性能服务器编程——高级I/O函数

重定向dup和dup2函数 [cpp] view plaincopyprint? #include <unistd.h> int dup(int file_descriptor); int dup2(int file_descriptor_one, int file_descriptor_two); dup创建一个新的文件描述符, 此描述符和原有的file_descriptor指向相同的文件.管道或者网络连接. dup返回的文件描述符总是取系统当前可用的最小整数值. dup2函数通过使用参数f

Linux高性能服务器编程——信号及应用

 信号 信号是由用户.系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常.Linux信号可由如下条件产生: 对于前台进程,用户可以通过输入特殊的终端字符来给它发送信号.比如输入Ctrl+C通常会给进程发送一个终端信号. 2.系统异常 系统状态变化 运行kill命令或调用kill函数 Linux信号概述 发送信号 Linux下,一个进程给其他进程发送信号的API是kill函数.其定义如下: #include <sys/types.h> #include <sign

Linux高性能服务器编程——多进程编程

多进程编程 多进程编程包括如下内容: 复制进程影映像的fork系统调用和替换进程映像的exec系列系统调用. 僵尸进程以及如何避免僵尸进程 进程间通信(Inter-Process Communication,IPC)最简单的方式:管道 3种进程间通信方式:信号量,消息队列和共享内存 fork系统调用 #include<unistd.h> pid_tfork(void); 该函数的每次都用都返回两次,在父进程中返回的是子进程的PID,在子进程中返回的是0.该返回值是后续代码判断当前进程是父进程还

Linux高性能服务器编程——系统检测工具

系统检测工具 tcpdump tcpdump是一款经典的转包工具,tcpdump给使用者提供了大量的选项,泳衣过滤数据报或者定制输出格式. lsof lsof是一个列出当前系统打开的文件描述符的工具.通过它我们可以了解感兴趣的进程打开了哪些文件描述符,或者我们感兴趣的文件描述符被哪些进程打卡了. nc nc命令主要被用来快速构建网络连接.我们可以让它以服务器方式运行,监听某个端口并接收客户连接,因此它可用来调试客户端程序.我们也可以使之以客户端方式运行,向服务器发起连接并收发数据,因此它可以用来

Linux高性能服务器编程——进程池和线程池

进程池和线程池 池的概念 由于服务器的硬件资源"充裕",那么提高服务器性能的一个很直接的方法就是以空间换时间,即"浪费"服务器的硬件资源,以换取其运行效率.这就是池的概念.池是一组资源的集合,这组资源在服务器启动之初就完全被创建并初始化,这称为静态资源分配.当服务器进入正是运行阶段,即开始处理客户请求的时候,如果它需要相关的资源,就可以直接从池中获取,无需动态分配.很显然,直接从池中取得所需资源比动态分配资源的速度要快得多,因为分配系统资源的系统调用都是很耗时的.当