2015-10-17 82 views
0

我正在創建函數,可以將函數聲明值傳遞給參數變量。C函數參數爲全局變量設置值?

例如,從我server.c文件:

int sfd; //socket file descriptor 
int listenv; //if listen 
struct sockaddr_in serverAddress; //server address 

int main(int argc, char * argv[]) { //argv[0] == server //argv[1] == port number 

    listenv = setServer(argv[1],serverAddress,sfd); 
      //int port = ntohs(serverAddress.sin_port); 
      printf("sfd = %d port = %d\n", sfd, ntohs(serverAddress.sin_port)); 
    while (listenv == 0) { 
    } 
} 

從我serverAPI.h文件:

int setServer (char * portn,struct sockaddr_in saddr,int sfd) { 

    saddr.sin_family = AF_INET; 
    saddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    saddr.sin_port = (int)htons(atoi(portn)); 


    sfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sfd < 0) 
     error("ERROR opening socket"); 
    printf("Successfully opened socket sfd = %d\n",sfd); 

    if (bind(sfd, (struct sockaddr *) &saddr, sizeof(saddr)) == -1) 
     error("ERROR on binding"); 
    printf("Successfully Binded on port %d\n", ntohs(saddr.sin_port));//show correct port number 

    int listenv; 
    if((listenv = listen(sfd,5)) < 0) 
     error("ERROR on listening"); 
    //print message to show connection has been made 
    printf("Ready and Listening..."); 

    return (listenv); 
} 

這是我...

我期望從'setServer'函數中,通過變量(即ServerAddress和sfd),值將被該函數聲明,但它沒有...

所以setServer函數中的返回值是:

serverAddress.sin_port = 12345 
sfd = 3 
listenv = 0 

,並從主:

serverAddress.sin_port = 0 
sfd = 0 
listenv = 0 

,因爲它已被列爲全球。

我需要爲setServer設置什麼參數才能設置全局變量的值?

+0

'setServer'需要一個'結構sockaddr_in'作爲第二個參數。你傳遞一個'struct sockaddr_in *'。錯字? – Downvoter

+0

錯別字對不起!哈哈 –

回答

2

作爲C語言修改sfdsaddr當經過拷貝按值,參數,只修改參數itsself,即,傳遞的參數的副本。你需要傳遞指針來實際修改變量。聲明setServer這樣的:

int setServer (char * portn, struct sockaddr_in* saddr, int* sfd); 

添加非關聯化運營:

saddr->sin_family = AF_INET; 
saddr->sin_addr.s_addr = htonl(INADDR_ANY); 
saddr->sin_port = (int)htons(atoi(portn)); 


*sfd = socket(AF_INET, SOCK_STREAM, 0); 
if (*sfd < 0) 
    error("ERROR opening socket"); 
printf("Successfully opened socket sfd = %d\n",*sfd); 

if (bind(*sfd, (struct sockaddr *) saddr, sizeof(*saddr)) == -1) 
    error("ERROR on binding"); 
printf("Successfully Binded on port %d\n", ntohs(saddr->sin_port));//show correct port number 

int listenv; 
if((listenv = listen(*sfd,5)) < 0) 
    error("ERROR on listening"); 
//print message to show connection has been made 
printf("Ready and Listening..."); 

return (listenv); 

並調用setServer指針

listenv = setServer(argv[1],&serverAddress,&sfd); 
+0

這是否意味着我必須聲明全局變量: int * sfd; //套接字文件描述符 int * listenv; // if listen struct sockaddr_in * serverAddress; //服務器地址 ??? –

+0

listenv怎麼樣? 如果在setServer函數中設置了listenv == -1,那麼主要內部的listenv變量的值仍然爲0(由全局變量初始化) @cad –

+0

@YongHeeLee如果您從'setServer'返回'-1',被分配給'main'中的'listenv',所以應該按照預期工作。 – Downvoter