美文网首页
简单循环服务器实现

简单循环服务器实现

作者: 咸鱼而已 | 来源:发表于2017-04-17 14:32 被阅读51次

    一个简单的socket常见接口的基本用法。同步阻塞模型。

    1. 客户端部分:
    
    #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>
    #include<arpa/inet.h>
    
    #define MAXLINE 4096
    
    int main(int argc, char** argv)
    {
        int    sockfd, n,rec_len;
        char    recvline[4096], sendline[4096];
        char    buf[MAXLINE];
        struct sockaddr_in    servaddr;
        //获取套接字
        if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
            printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
            exit(0);
        }
        //清空servaddr中的内容,都置为0
        memset(&servaddr, 0, sizeof(servaddr));
        //初始化服务器地址
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
        servaddr.sin_port = htons(8000);
    //    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
        //建立连接
        if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
            printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
            exit(0);
        }
        printf("send msg to server: \n");
        fgets(sendline, 4096, stdin);
        //发送数据
        if( send(sockfd, sendline, strlen(sendline), 0) < 0)
        {
            printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
            exit(0);
        }
        //接收数据
        if((rec_len = recv(sockfd, buf, MAXLINE,0)) == -1) {
            perror("recv error");
            exit(1);
        }
        buf[rec_len]  = '\0';
        printf("Received : %s ",buf);
        //关闭连接
        close(sockfd);  
        exit(0);  
    }
    

    2.服务端部分:

    #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>
    #include <arpa/inet.h>
    #define DEFAULT_PORT 8000
    #define MAXLINE 4096
    int main(int argc, char** argv)
    {
        int    socket_fd, connect_fd;
        struct sockaddr_in     servaddr, remotaddr;
        char    buff[4096];
        int     n;
        //初始化Socket
        if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
            printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
            exit(0);
        }
        //初始化
        memset(&servaddr, 0, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
        servaddr.sin_port = htons(DEFAULT_PORT);//设置的端口为DEFAULT_PORT
        servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
        
        //将本地地址绑定到所创建的套接字上
        if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
            printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
            exit(0);
        }
        //开始监听是否有客户端连接
        if( listen(socket_fd, 10) == -1){
            printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
            exit(0);
        }
        printf("==========waiting for client's request==========\n");
        while(1){
            //阻塞直到有客户端连接,不然多浪费CPU资源。sizeof(struct sockaddr)
            socklen_t addrsize = sizeof(struct sockaddr);
            if((connect_fd = accept(socket_fd, (struct sockaddr*)&remotaddr, &addrsize)) == -1){
                if (errno == EINTR)
                    continue;
                else
                    printf("accept socket error: %s(errno: %d)\n",strerror(errno),errno);
                    continue;
            }
            printf("accept from ip: %s\n", inet_ntoa(remotaddr.sin_addr));
            //接受客户端传过来的数据
            n = recv(connect_fd, buff, MAXLINE, 0);
            buff[n] = '\0';
            //向客户端发送回应数据
            if(!fork()){ /*紫禁城*/
                if(send(connect_fd, buff, sizeof(buff),0) == -1)
                    perror("send error\n");
                close(connect_fd);
                exit(0);
            }
            
            printf("recv msg from client: %s\n", buff);
            close(connect_fd);  
        }  
        close(socket_fd);  
    }
    

    相关文章

      网友评论

          本文标题:简单循环服务器实现

          本文链接:https://www.haomeiwen.com/subject/zietzttx.html