3

私の端末は create と fork を続けます。コードで何か間違ったことをしたと思います。実際には、クライアントが接続するときにフォークが必要ですが、サーバーを起動すると、Linuxコマンド「ps」でチェックするときにフォークを続けます。コードを変更して機能させるにはどうすればよいですかちゃんと。

#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 を介して通信します。

4

2 に答える 2

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);
    }
}

そうすれば、accept が負でない値を返す場合にのみ fork します (つまり、正常に完了したことを意味します)。

于 2012-08-02T03:39:56.747 に答える
4

からの戻り値を確認する必要がありますaccept()。エラーが発生しています。これを修正する必要があります。

fork() を呼び出し続ける理由は、ループを一周するたびに、accept() が新しい接続を待つ代わりに (非常に迅速に!) エラーを返すためです。

于 2012-08-02T03:44:30.880 に答える