2012-08-02 35 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