2014-01-09 68 views
0

我的代碼是:編譯錯誤

#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 

那麼有誰知道有什麼問題或困難?我試圖搜索第一個錯誤,但我找不到任何東西。也許在編譯命令中有問題。我忘了什麼嗎?

回答

1

您有一個額外的支柱}這裏:

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

} 

第二支柱被假定爲函數的結尾,因此你的代碼的其餘部分會產生警告。

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++中,始終修復第一個錯誤,然後重新編譯並查看仍然存在哪些錯誤。通常,一個微小的錯誤可能會產生一系列錯誤。