我该如何解决 "expected a ';' in C"

How do I solve "expected a ';' in C"

我正在努力完成我的网络编程练习。我遇到了这个我无法解决的问题。这可能看起来很愚蠢,但我已经花了一个下午在上面。如果有人能帮助我,我将不胜感激。

这是代码,错误在#ifdef process_conn_server_2段内。

#include <stdio.h>
#include <sys/uio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <sys/types.h>
#include "process_num.c"

#define process_conn_client_2
#define process_conn_server_2

static struct iovec *vs = NULL,
                    *vc = NULL;

void sig_process(int signo)
{
    printf("Catch ax exit signal\n");
    free(vc);
    free(vs);
    _exit(0);
}

void sig_pipe(int signo)
{
    printf("Catch a SIGPIPE signal\n");
    free(vc);
    free(vs);
    _exit(0);
}
#ifdef process_conn_client_0
void process_conn_client(int s)
{
    ssize_t size = 0;
    char buffer[1024]; 

    for (;;)
    {
        size = read(0, buffer, 1024);
        // size = recv(s, buffer, 1024, 0);

        if (size > 0)
        {

            send(s, buffer, size, 0);

            size = recv(s, buffer, 1024, 0);
            write(1, buffer, size);
        }
    }
}
#endif // read、send、write

#ifdef process_conn_client_1
void process_conn_client(int s)
{
    char buffer[30];
    ssize_t size = 0;

    struct iovec *v = (struct iovec *)malloc(3 * sizeof(struct iovec));
    if (!v)
    {
        printf("Not enough memory\n");
        return;
    }

    vc = v;

    v[0].iov_base = buffer;
    v[1].iov_base = buffer + 10;
    v[2].iov_base = buffer + 20;
    v[0].iov_len = v[1].iov_len = v[2].iov_len = 10;

    int i = 0;
    for (;;)
    {
        size = read(0, v[0].iov_base, 10);
        if (size > 0)
        {

            v[0].iov_len = size;
            writev(s, v, 1);

            v[0].iov_len = v[1].iov_len = v[2].iov_len = 10;
            size = readv(s, v, 3);

            for (i = 0; i < 3; i++)
            {
                if (v[i].iov_len > 0)
                {
                    write(1, v[i].iov_base, v[i].iov_len);
                }
            }
        }
    }
}
#endif // read writev readv

#ifdef process_conn_client_2
void process_conn_client(int s)
{
    char buffer[30];
    ssize_t size = 0;
    struct msghdr msg;

    struct iovec *v = (struct iovec *)malloc(3 * sizeof(struct iovec));
    if (!v)
    {
        perror("wrong: allocate memory\n");
        return;
    }

    msg.msg_name = NULL;
    msg.msg_namelen = 0;
    msg.msg_control = NULL;
    msg.msg_controllen = 0;
    msg.msg_iov = v;
    msg.msg_iovlen = 3;
    msg.msg_flags = 0;

    vc = v;
    v[0].iov_base = buffer;
    v[1].iov_base = buffer + 10;
    v[2].iov_base = buffer + 20;
    v[0].iov_len = v[1].iov_len = v[2].iov_len = 10;

    // int fd;
    for (;;)
    {
        // fd = open("firstfile.txt", O_RDONLY, 0666);
        size = read(0, v[0].iov_base, 10);
        printf("%d size\n", size);
        if (size > 0)
        {
            v[0].iov_len = size;

            if (sendmsg(s, &msg, 0) < 0)
            {
                perror("");
                return;
            }

            v[0].iov_len = v[1].iov_len = v[2].iov_len = 10;
            memset(v[0].iov_base, '[=11=]', v[0].iov_len);
            memset(v[1].iov_base, '[=11=]', v[1].iov_len);
            memset(v[2].iov_base, '[=11=]', v[2].iov_len);
            size = recvmsg(s, &msg, 0);

            for (int i = 0; i < 3; i++)
            {
                if (v[i].iov_len > 0)
                {
                    write(1, v[i].iov_base, v[i].iov_len);
                    write(1, '\n', 1);
                }
            }
            memset(v[0].iov_base, '[=11=]', v[0].iov_len);
            memset(v[1].iov_base, '[=11=]', v[1].iov_len);
            memset(v[2].iov_base, '[=11=]', v[2].iov_len);
        }
    }
#endif // sendmsg recvmsg

#ifdef process_conn_server_0

    void process_conn_server(int s)
    {
        ssize_t size = 0;
        char buffer[1024];
        float result;

        for (;;)
        {
            // size = read(s, buffer, 1024);
            size = recv(s, buffer, 1024, 0);
            if (size == 0)
            {
                return;
            }

            printf("received %s", buffer);
            result = process_num(buffer);
            if (result == 65535)
            {
                sprintf(buffer, "%d bytes in total.\n", size);
            }
            else
            {
                printf("%f\n", result);
                sprintf(buffer, "the result is %f.\n", result);
            }
            //write(s, buffer, strlen(buffer) + 1); 
            send(s, buffer, strlen(buffer) + 1, 0);
            memset(buffer, '[=11=]', sizeof(buffer));
        }
    }

#endif //recv send

#ifdef process_conn_server_1

    void process_conn_server(int s)
    {
        char buffer[30];
        ssize_t size = 0;

        struct iovec *v = (struct iovec *)malloc(3 * sizeof(struct iovec));
        if (!v)
        {
            printf("Not enough memory\n");
            return;
        }

        vs = v;
        v[0].iov_base = buffer;
        v[1].iov_base = buffer + 10;
        v[2].iov_base = buffer + 20;
        v[0].iov_len = v[1].iov_len = v[2].iov_len = 10;

        for (;;)
        {
            size = readv(s, v, 3);
            if (size == 0)
            {
                return;
            }
            sprintf(v[0].iov_base, "%d ", size);
            sprintf(v[1].iov_base, "bytes alt");
            sprintf(v[2].iov_base, "ogether\n");

            v[0].iov_len = strlen(v[0].iov_base);
            v[1].iov_len = strlen(v[1].iov_base);
            v[2].iov_len = strlen(v[2].iov_base);

            writev(s, v, 3);
        }
    }
#endif // readv writev

#ifdef process_conn_server_2
 

    void process_conn_server(int s)
    {                                  //this is where the error appears
        char buffer[30];
        ssize_t size = 0;
        struct msghdr msg;

        struct iovec *v = (struct iovec *)malloc(3 * sizeof(struct iovec));
        if (!v)
        {
            perror("wrong: allocate memory\n");
            return;
        }

        msg.msg_name = NULL;
        msg.msg_namelen = 0;
        msg.msg_control = NULL;
        msg.msg_controllen = 0;
        msg.msg_iov = v;
        msg.msg_iovlen = 3;
        msg.msg_flags = 0;

        vs = v;
        v[0].iov_base = buffer;
        v[1].iov_base = buffer + 10;
        v[2].iov_base = buffer + 20;
        v[0].iov_len = v[1].iov_len = v[2].iov_len = 10;

        for (;;)
        {

            size = recvmsg(s, &msg, 0);

            if (size == 0)
            {
                return;
            }

            sprintf(v[0].iov_base, "%d ", size);
            sprintf(v[1].iov_base, "bytes alt");
            sprintf(v[2].iov_base, "ogether\n");

            v[0].iov_len = strlen(v[0].iov_base);
            v[1].iov_len = strlen(v[1].iov_base);
            v[2].iov_len = strlen(v[2].iov_base);

            for (int i = 0; i < 3; i++)
            {
                if (v[i].iov_len > 0)
                {
                    write(1, v[i].iov_base, v[i].iov_len);
                    write(1, '\n', 1);
                }
            }

            sendmsg(s, &msg, 0);

            memset(v[0].iov_base, '[=11=]', v[0].iov_len);
            memset(v[1].iov_base, '[=11=]', v[1].iov_len);
            memset(v[2].iov_base, '[=11=]', v[2].iov_len);
        }
    }
#endif

我不知道这是否有任何帮助,但当我

时代码工作正常

定义 process_conn_server/client 0/1 而不是 2。

当 process_conn_client_2 被定义时,您似乎没有关闭 process_conn_client(),因此在此之后打开另一个函数会给您一个错误。从缩进可以看出

只是为了全面澄清。 process_conn_client_2 定义的末尾缺少右括号 } 以终止函数定义。因此错误。

我在这段代码中用正确的 } 标记了问题所在:

#ifdef process_conn_client_2
void process_conn_client(int s)
{
    char buffer[30];
    ssize_t size = 0;
    struct msghdr msg;

    struct iovec *v = (struct iovec *)malloc(3 * sizeof(struct iovec));
    if (!v)
    {
        perror("wrong: allocate memory\n");
        return;
    }

    msg.msg_name = NULL;
    msg.msg_namelen = 0;
    msg.msg_control = NULL;
    msg.msg_controllen = 0;
    msg.msg_iov = v;
    msg.msg_iovlen = 3;
    msg.msg_flags = 0;

    vc = v;
    v[0].iov_base = buffer;
    v[1].iov_base = buffer + 10;
    v[2].iov_base = buffer + 20;
    v[0].iov_len = v[1].iov_len = v[2].iov_len = 10;

    // int fd;
    for (;;)
    {
        // fd = open("firstfile.txt", O_RDONLY, 0666);
        size = read(0, v[0].iov_base, 10);
        printf("%d size\n", size);
        if (size > 0)
        {
            v[0].iov_len = size;

            if (sendmsg(s, &msg, 0) < 0)
            {
                perror("");
                return;
            }

            v[0].iov_len = v[1].iov_len = v[2].iov_len = 10;
            memset(v[0].iov_base, '[=10=]', v[0].iov_len);
            memset(v[1].iov_base, '[=10=]', v[1].iov_len);
            memset(v[2].iov_base, '[=10=]', v[2].iov_len);
            size = recvmsg(s, &msg, 0);

            for (int i = 0; i < 3; i++)
            {
                if (v[i].iov_len > 0)
                {
                    write(1, v[i].iov_base, v[i].iov_len);
                    write(1, '\n', 1);
                }
            }
            memset(v[0].iov_base, '[=10=]', v[0].iov_len);
            memset(v[1].iov_base, '[=10=]', v[1].iov_len);
            memset(v[2].iov_base, '[=10=]', v[2].iov_len);
        }
    }
}                                                           // <------- HERE
#endif // sendmsg recvmsg

由于打字错误,我投票决定关闭此问题。