套接字服务器代码中的编译错误

时间:2014-01-09 00:09:52

标签: c sockets

我的代码是:

#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <sys/types.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
#include <stdio.h>
#include <signal.h>

#define MAXCLIENTS 20
#define N 5

typedef struct{
    int n1;
    int n2;
    int n3;
    int port;
    char ip[100];
}Data;

Data* nd;

typedef struct{
    int cfd;
    struct sockaddr_in client_addr;
}Args;

void catch_sigint(int sig)
{
    close(sig);
    exit(5);
}

sem_t sem;
pthread_mutex_t mutex;
int* maxSum;

void* connectedClient(void* arg){


    Args* a = (Args*)arg;

    sem_wait(&sem);

    Data* d = (Data*)malloc(sizeof(Data));
    recv(a->cfd,d,sizeof(Data),0);

    printf("Primul numar: %d\n", d->n1);
    printf("Al doilea numar: %d\n", d->n2);
    printf("Al treilea numar: %d\n", d->n3);

    int currentSum= d->n1 + d->n2 + d->n3;

    pthread_mutex_lock(&mutex);

    if(currentSum > *maxSum){
        printf("Suma curenta este mai mare decat maximul ");

        *maxSum= currentSum;

        printf("Suma este: %d\n",*maxSum);

        nd->n1=d->n1;
        nd->n2=d->n2;
        nd->n3=d->n3;
        nd->port=ntohs(a->client_addr.sin_port);

        char* buff;

        buff= inet_ntoa(a->client_addr.sin_addr);
        strcpy(nd->ip,buff);
    }
    else
    {
        printf("Suma curenta nu este mai mare decat maximul");
    }

    send(a->cfd,nd,sizeof(Data),0);
    pthread_mutex_unlock(&mutex);

    sem_post(&sem);

}

int main(int argc, char* argv[])
{
    pthread_t threads[MAXCLIENTS];
    sem_init(&sem,0,N);
    pthread_mutex_init(&mutex,NULL);

    maxSum = (int*)malloc(sizeof(int));
    *maxSum = 0;
    nd = malloc(sizeof(Data));

    int client_index = 0;

    int sfd,cfd;
    struct sockaddr_in serv_addr, client_addr;
    socklen_t client_len;

    signal(SIGINT, catch_sigint);

    if((sfd=socket(AF_INET,SOCK_STREAM,0))<0)
    {
        perror("Eroare la crearea socket!\n");
        exit(1);}

    }

    memset(&serv_addr,'0',sizeof(serv_addr));

    serv_addr.sin_family= AF_INET;
    serv_addr.sin_port= htons(9000);
    serv_addr.sin_addr.s_addr=INADDR_ANY;

    if(bind(sfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)
    {
        printf("Eroare la bind\n");
        exit(2);
    }

    if(listen(sfd,5)<0)
    {
        perror("Eroare la listen\n");
        exit(3);
    }


    while(1)
    {
        client_len=sizeof(client_addr);
        if((cfd=accept(sfd,(struct sockaddr*)&client_addr,&client_len))<0)
        {
            printf("Eroare la accept\n");
            exit(4);
        }

    printf("Clientul este conectat de pe ip %s si portul %d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

    Args *a = (Args*) malloc(sizeof(Args));
    a->cfd=cfd;
    a->client_addr=client_addr;
    pthread_create(&threads[client_index],NULL,connectedClient,a);
    }
}

使用gcc -pthread ss.c编译后

ss.c:112:9: error: expected declaration specifiers or ‘...’ before ‘&’ token
ss.c:112:20: error: expected declaration specifiers or ‘...’ before '0'
ss.c:112:24: error: expected declaration specifiers or ‘...’ before ‘sizeof’
ss.c:114:11: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
ss.c:115:11: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
ss.c:116:11: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
ss.c:118:2: error: expected identifier or ‘(’ before ‘if’
ss.c:124:2: error: expected identifier or ‘(’ before ‘if’
ss.c:131:2: error: expected identifier or ‘(’ before ‘while’
ss.c:147:1: error: expected identifier or ‘(’ before ‘}’ token

那么有人知道问题是什么吗?我试图搜索第一个错误,但我找不到任何东西。也许编译命令有问题。我忘记了什么吗?

2 个答案:

答案 0 :(得分:1)

这里有一个额外的大括号}

if((sfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
    perror("Eroare la crearea socket!\n");
    exit(1);} <--- EXTRA } HERE

}

假设第二个括号是函数的结尾,因此代码的其余部分会产生警告。

答案 1 :(得分:1)

您的代码正上方有一个错误的额外括号}:

if((sfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
    perror("Eroare la crearea socket!\n");
    exit(1);} // <-- extra } here, remove this

}

memset(&serv_addr,'0',sizeof(serv_addr));

此外,在memset中,您想要0而不是'0',因为'0'是字符0,其ASCII值为48。

在C和C ++中,始终修复第一个错误,然后重新编译并查看剩余的错误。通常,一个小错误会产生一系列错误。