Untitled

mail@pastecode.io avatarunknown
plain_text
a month ago
2.7 kB
1
Indexable
Never
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

ssize_t serversend(int new_fd, const char *outdata)
{
    return send(new_fd, outdata, strlen(outdata), 0);
}

/*
nbytes > 0:表示接收到了 nbytes 數量的字節。這是正常的數據接收。
nbytes == 0:表示連接已被對方關閉。
nbytes < 0:表示發生了錯誤。
*/
ssize_t serverrecv(int new_fd, char *indata, size_t buflen)
{   
    ssize_t nbytes = recv(new_fd, indata, buflen - 1, 0);
    if(nbytes > 0)
    {
        indata[nbytes] = '\0';       //使用 null 終止符號
    }
    return nbytes;
}

int main()
{
    const char* host = "0.0.0.0";
    int port = 7000;

    int sock_fd, new_fd;
    socklen_t addrlen;
    struct sockaddr_in my_addr, client_addr;
    int status;
    char indata[1024] = {0}, outdata[1024] = {0};
    int on = 1;

    // create a socket
    sock_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (sock_fd == -1) {
        perror("Socket creation error");
        exit(1);
    }

    // for "Address already in use" error message
    if (setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(int)) == -1) {
        perror("Setsockopt error");
        exit(1);
    }

    // server address
    my_addr.sin_family = AF_INET;
    inet_aton(host, &my_addr.sin_addr);
    my_addr.sin_port = htons(port);

    status = bind(sock_fd, (struct sockaddr *)&my_addr, sizeof(my_addr));
    if (status == -1) {
        perror("Binding error");
        exit(1);
    }
    printf("server start at: %s:%d\n", inet_ntoa(my_addr.sin_addr), port);

    status = listen(sock_fd, 5);
    if (status == -1) {
        perror("Listening error");
        exit(1);
    }
    printf("wait for connection...\n");

    addrlen = sizeof(client_addr);

    while (1) {

        new_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &addrlen);
        printf("connected by %s:%d\n", inet_ntoa(client_addr.sin_addr),
            ntohs(client_addr.sin_port));

        while (1) {
            memset(indata,0,sizeof(indata));

            size_t nbytes =serverrecv(new_fd, indata, sizeof(indata));
            //recv(new_fd, indata, sizeof(indata), 0);
            if (nbytes <= 0) {
                close(new_fd);
                printf("client closed connection.\n");
                break;
            }
            indata[nbytes] = '\0';
            printf("recv: %s\n", indata);
            snprintf(outdata, sizeof(outdata), "echo %s", indata);
            serversend(new_fd, outdata);
        }
    }
    close(sock_fd);

    return 0;
}