zoukankan      html  css  js  c++  java
  • socket server

    我的第一个socket 编程。

    首先创建一个server 类, 然后在类中添加四个成员. 

    初始化。

    TcpServer (listenPort)

    记得在初始化servAddr 的时候要  先清零. 因为该成员的最后八位是0 。为了方便所以直接清零。

    bzero(&servAddr, sizeof(servAddr)); 要记得加 & 因为servAddr 是一个类, 不是一个数值。

    isAccept() 

    这个accept 函数, 记得在 &len, 并不止是简单的sizeof(clntAddr)

    handleEcho()

    这个函数最简单了, 只要记得

    数据的交流, 就是communicationSock, 

    recv 返回值,如果小于零就是失败, 等于零就是对方主动关闭链接。 大于零就是这次发送的长度

    要记得在TCP 上传送的是以回车为一个语句。 但是 它传过来的并不包含'\0'

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

    class TcpServer
    {
    private:
    int listenSock;
    int communicationSock;
    sockaddr_in servAddr;
    sockaddr_in clntAddr;

    public:
    TcpServer(int listenPort);
    bool isAccept();
    void handleEcho();
    };

    TcpServer::TcpServer(int listenPort)
    {
    if ((listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
    {
    throw "socket()failed";
    }
    bzero(&servAddr, sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    servAddr.sin_port = htons(listenPort);
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    if (bind(listenSock, (sockaddr *) &servAddr, sizeof(servAddr)) < 0)
    {
    throw "bind()failed";
    }
    if (listen(listenSock , 10) < 0)
    {
    throw "listen()failed";
    }
    }

    bool TcpServer::isAccept()
    {
    unsigned int len = sizeof(clntAddr);
    if ((communicationSock = accept(listenSock, (sockaddr *) &clntAddr, &len)) < 0)
    {
    return false;
    }
    else
    {
    printf("client ip:(%s)\n", inet_ntoa(clntAddr.sin_addr));
    return true;
    }
    }

    void TcpServer::handleEcho()
    {
    const int BUFFLEN = 32;
    char buffer[BUFFLEN];
    int len;
    bool goon = true;

    while (goon)
    {
    if ((len = recv(communicationSock, buffer, BUFFLEN, 0)) < 0)
    {
    throw "recv()failed";
    }
    if (len == 0)
    {
    printf("exit()success\n");
    goon = false;
    }
    else
    {
    buffer[len] = 0;
    printf("%s\n", buffer);
    if (len != send(communicationSock, buffer, len, 0))
    {
    throw "send()failed";
    }
    }
    }
    close(communicationSock);
    }

    int echo_server(int argc, char *argv[]);

    int main(int argc, char *argv[])
    {
    int mainRtn = 0;
    try
    {
    mainRtn = echo_server(argc, argv);
    }
    catch(const char *s)
    {
    perror(s);
    exit(EXIT_FAILURE);
    }
    return mainRtn;
    }

    int echo_server(int argc, char *argv[])
    {
    int port = 5000;
    if (argc == 2)
    {
    port = atoi(argv[1]);
    }

    TcpServer myServer(port);
    while (true)
    {
    if (myServer.isAccept())
    {
    myServer.handleEcho();
    break;
    }
    }
    return 0;
    }



  • 相关阅读:
    160912、工具类:spring+springmvc自定义编码转换
    160909、Filter多方式拦截、禁用IE图片缓存、Filter设置字符编码
    160908、前端开发框架Semantic UI
    160907、CSS 预处理器-Less
    160906、Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
    160905、c3p0详细配置
    160902、Ionic、Angularjs、Cordova搭建Android开发环境
    160901、在大型项目中组织CSS
    160831、过滤器和拦截器的区别
    (转)Uiautomator——API详解
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/2430874.html
Copyright © 2011-2022 走看看