c_cpp server.c

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp server.c相关的知识,希望对你有一定的参考价值。

#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>

#define MY_SOCK_PATH "/tmp/echo.sock"

volatile sig_atomic_t eflag = 0;

void sig_handle(int signum) {
    eflag = 1;
}

int main(int argc, char const* argv[])
{
    if (signal(SIGINT, sig_handle) == SIG_ERR) {
      exit(2);
    }
    struct sockaddr_un addr, peer_addr;
    int sock = socket(AF_LOCAL, SOCK_STREAM, 0);
    if (sock == -1) {
        perror("failed to create socket");
    exit(1);
    }
    if (fcntl(sock, F_SETFL, O_NONBLOCK) == -1) {
        perror("failed to fcntl");
    exit(1);
    }

    socklen_t peer_addr_size;
    memset(&addr, 0, sizeof(struct sockaddr_un));
    addr.sun_family = AF_LOCAL;
    // strcpy(addr.sun_path, MY_SOCK_PATH);
    strcpy(addr.sun_path, MY_SOCK_PATH);

    if ((bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_un))) == -1)  {
        perror("failed to bind socket");
        exit(1);
    }
    if ((listen(sock, 4)) == -1) {
        perror("failed to listen socket");
        exit(1);
    }

    memset(&peer_addr, 0, sizeof(struct sockaddr_un));
    socklen_t len = sizeof(struct sockaddr_un);

    fd_set rfds;
    int retval;

    while (!eflag) {
        struct timeval tv;
        tv.tv_sec = 5;
        tv.tv_usec = 0;

        FD_ZERO(&rfds);
        FD_SET(sock, &rfds);

        retval = select(sock+1, &rfds, NULL, NULL, &tv);
        if (retval == -1) {
            perror("failed to select:");
            if (errno == EINTR) {
                break;
            } else {
                exit(1);
            }
        } else if (retval) {
            int fd = accept(sock, (struct sockaddr *)&peer_addr, &len);
            if (fd < 0) {
                perror("failed to accept");
                exit(1);
            }
            printf("[server] accept\n");

            char buf[64];
            read(fd, buf, 64);
            size_t s = sizeof(buf);
            printf("[server] read\n");
            sleep(1);
            write(fd, buf, s);
        } else {
            printf("timeout\n");
        }
    }

    close(sock);
    remove(MY_SOCK_PATH);
    return 0;
}

以上是关于c_cpp server.c的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp select_server.c

c_cpp server_tcp_epoll.c

c udp server client demo --待调试

Openssl Server C Demo

Openssl Server C Demo

Openssl Server C Demo