2012-08-02 34 views
3

我的終端保持創建和分叉。我認爲我在代碼中做了錯誤的事情,實際上當客戶端連接時我想要fork,但是當我啓動服務器時,當我使用linux命令「ps」進行檢查時,其狀態保持不變,如何更改我的代碼以使其工作正常。C - 我的程序保持叉不停,崩潰我的終端

#include <iostream> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/un.h> 
#include <sys/types.h> 
#include <sys/socket.h> 


using namespace std; 

int main() 
{ 

int serverFd; 
int clientFd; 
int serverLen; 
int clientLen; 
string message; 
string serverSockAddrPtr; 
struct sockaddr* serverSockAddressPnt; 
struct sockaddr* clientSockAddressPnt; 
struct sockaddr_un serverAddress; 
struct sockaddr_un clientAddress; 


// SOCKET CREATION PART - SERVER 
serverFd = socket (AF_LOCAL, SOCK_STREAM, 0); 

/* Set domain type */ 
serverAddress.sun_family = AF_LOCAL; 

/* Set name */ 
strcpy (serverAddress.sun_path, "CountryServer"); 


/* GET SIZE OF Server Addres */ 
serverLen = sizeof serverAddress; 
/* GET SIZE OF Client Addres */ 
clientLen = sizeof clientAddress; 

/* Get Server Sock Address Pointer*/ 
serverSockAddressPnt = (struct sockaddr *) &serverAddress; 
/* Get Client Sock Address Pointer*/ 
clientSockAddressPnt = (struct sockaddr *) &clientAddress; 

/* Create file */ 
bind (serverFd, serverSockAddressPnt , serverLen); 

/* listen for connection */ 
listen (serverFd,5); 

// SOCKET CREATION END - SERVER 


while(1) 
{ 
//accept client connection 
clientFd = accept(serverFd, clientSockAddressPnt, (socklen_t*)&clientLen); 

if(fork()==0) 
{ 
message="Successfully connected to the server"; 
write(clientFd,message.c_str(),strlen(message.c_str())+1); 
close(clientFd); 
exit(0); 
} 
else 
close(clientFd); 

} 

return 0; 
} 

我的問題是: 如何使服務器創建一個進程時,他們連接到處理客戶查詢。

我不希望它沒有理由繼續分叉。 感謝所有幫助,這是我的第一個C編碼,以更多地瞭解編程。

我的客戶端和服務器通過localhost,sockaddr_un進行通信,而不是互聯網。

+0

聽起來像你叉炸自己? – Mysticial 2012-08-02 03:34:37

+0

是的,我做了,我該如何修復它哈哈,我是新來C編程 – 2012-08-02 03:39:35

+0

@Mysticial:不是一個叉炸彈,它會導致機器崩潰,只是連續分岔(一次一個)的孩子,因爲「accept」的返回值不會檢查錯誤。 – bstpierre 2012-08-02 03:45:45

回答

4

什麼,你應該有你的循環是:

while (1) { 
    clientFd = accept(serverFd, clientSockAddressPnt, (socklen_t*)&clientlen); 
    if (clientFd >= 0) { 
     if(fork() == 0) { 
      message="Successfully connected to the server"; 
      write(clientFd,message.c_str(),strlen(message.c_str())+1); 
      close(clientFd); 
      exit(0); 
     } 
     else 
      close(clientFd); 
    } 
} 

這樣的話,你永遠只能叉接受退貨時,非負值(這意味着它成功完成

+0

如何讓程序在客戶端連接時分叉,而不是繼續分叉。 – 2012-08-02 03:40:45

+0

我在做本地主機連接,只有sockaddr_un,而不是互聯網 – 2012-08-02 03:41:42

+0

用if語句包裝你的if/else塊,以確保你只在連接時執行它。如果我沒有記錯,accept會在成功時返回一個非負整數,所以你可能想'if(clientFd> = 0)' – 2012-08-02 03:43:41

4

你應該檢查返回值。從accept()。你得到一個錯誤,你應該修復。

它繼續調用fork()的原因是因爲每當你繞過循環,accept()返回(真的很快!)帶有錯誤,而不是等待新的c onnection。

+0

我應該如何繼續進行檢查。並確保它不會保留分叉,並且只有分叉連接時才處理客戶端。沒有客戶端連接時什麼都不做(不分叉) – 2012-08-02 03:47:44