zoukankan      html  css  js  c++  java
  • Server Develop (一) 简单的TCP/IP C/S

    简单的C/S

    //server.h
    #include "utl.h" class server{ public: server(const short port); ~server(); int initServer(); void startListen(); //循环accept,可以通过继承来增加多线程 private: struct sockaddr_in server_addr; int sock_serv; };
    //server.cc
    #include "server.h" #include "utl.h" server::server( const short port) { memset( &server_addr, 0, sizeof(server_addr) ); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr.s_addr = htonl( INADDR_ANY ); } server::~server() { close(sock_serv); } int server::initServer() { sock_serv = socket(AF_INET, SOCK_STREAM, 0); if(sock_serv < 0){ perror("socket error!\n"); return -1; } int on = 1; setsockopt( sock_serv, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ); int flag = bind(sock_serv, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(flag < 0){ perror("bind error!\n"); close(sock_serv); return -1; } return 0; } void server::startListen() { int flag = listen(sock_serv, 5); if(flag < 0){ perror("listen error!\n"); close(sock_serv); return; } char buffer[1024]; while(1){ bzero(buffer,sizeof(buffer)); struct sockaddr_in client_addr; int size = sizeof(client_addr); int sock_client = accept(sock_serv, (struct sockaddr*)(&client_addr), (unsigned int*)(&size)); if(sock_client < 0){ perror("accept error!\n"); continue; } strcpy(buffer, "this is server! welcome!\n"); send(sock_client, buffer, 1024, 0); bzero(buffer,sizeof(buffer)); flag = recv(sock_client, buffer, 1024, 0); if(flag < 0){ perror("recv error!\n"); close(sock_serv); return; } printf("recv : %s\n",buffer); while(1){ bzero(buffer,sizeof(buffer)); flag = recv(sock_client, buffer, 1024, 0); if(flag < 0){ perror("recv error!\n"); close(sock_serv); return; } printf("i have recv buffer\n"); printf("recv : %s\n",buffer); if(strcmp(buffer,"quit") == 0){ printf("quit!!!\n"); break; } } } }
    //client.cc
    #include <stdio.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <errno.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <iostream>
    using namespace std;
    
    
    int main(int argc, char** argv)
    {
        int sock_client;
        struct sockaddr_in server_addr;
    
        sock_client = socket(AF_INET, SOCK_STREAM, 0);
        if(sock_client < 0 ){
            perror("socket error!\n");
            return -1;
        }
    
        bzero(&server_addr, sizeof(struct sockaddr_in));
        server_addr.sin_family         = AF_INET;
        server_addr.sin_port           = htons(8000);
        server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    
        int flag;
        flag = connect(sock_client,(struct sockaddr*)(&server_addr), sizeof(struct sockaddr));
        if(flag < 0){
            perror("connect error!\n");
            close(sock_client);
            return -1;
        }
    
        printf("connect to server : OK! \n");
    
        char buffer[1024];
    
    
        //printf("%s\n",buffer);
    
        bzero(buffer,sizeof(buffer));
        recv(sock_client, buffer, 1024, 0);
        printf("recv : %s\n", buffer);
    
        bzero(buffer,sizeof(buffer));
        strcpy(buffer,"this is client!\n");
        send(sock_client, buffer, 1024, 0);
    
        while(1){
            bzero(buffer,sizeof(buffer));
            cin>>buffer;
            int p = strlen(buffer);
            buffer[p] = '\0';
            send(sock_client, buffer, 1024, 0);
            printf("i have send buffer\n");
        }

    close(sock_client); return 0; }
  • 相关阅读:
    【SignalR学习系列】6. SignalR Hubs Api 详解(C# Server 端)
    【SignalR学习系列】5. SignalR WPF程序
    小程序商城Mall,打造最佳SpringCloudAlibaba最佳实践
    《SpringCloudDubbo开发日记》(一)Nacos连官方文档都没写好
    Java后端开发工程师是否该转大数据开发?
    动态生成简约MVC请求接口|抛弃一切注解减少重复劳动吧
    主键生成器效率提升方案|基于雪花算法和Redis控制进程隔离
    高并发场景-请求合并(二)揭秘HystrixCollapser-利用Queue和线程池异步实现
    使用TiDB把自己写分库分表方案推翻了
    JMETER并发压测-自定义不同请求参数
  • 原文地址:https://www.cnblogs.com/coder2012/p/3131541.html
Copyright © 2011-2022 走看看