插座(c)中的客户端服务器应用程序返回0 [英] socket() returns 0 in C client server application

查看:112
本文介绍了插座(c)中的客户端服务器应用程序返回0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我工作的一个包含多个服务器套接字的应用程序,以一种独特的线程每次运行。

的外部工具(脚本)是由一个线程调用。此脚本调用的实用程序(客户机)将消息发送给服务器套接字中的一个。

I'm working on an application that contains several server sockets that each run in a unique thread.
An external utility (script) is called by one of the threads. This script calls a utility (client) that sends a message to one of the server sockets.

最初,我是用系统()来执行这个外部脚本,但我们不能使用,因为我们必须确保服务器的套接字是在封闭这是派生的子执行外部脚本。

我现在请叉() execvp()自己。我叉(),然后在我关闭所有的服务器套接字,然后调用子 execvp()执行脚本。

Initially, I was using system() to execute this external script, but we couldn't use that because we had to make sure the server sockets were closed in the child that was forked to execute the external script.
I now call fork() and execvp() myself. I fork() and then in the child I close all the server sockets and then call execvp() to execute the script.

现在,这一切工作正常。问题是,在倍脚本报告错误给服务器应用程序。该脚本调用其他应用程序(客户端)打开一个TCP套接字,并发送相应的数据发送这些错误。我的问题是,客户端应用程序获取的值 0 插座()系统调用返回。

Now, all of that works fine. The problem is that at times the script reports errors to the server app. The script sends these errors by calling another application (client) which opens a TCP socket and sends the appropriate data. My issue is that the client app gets a value of 0 returned by the socket() system call.

注意:此当脚本/客户端应用程序在使用我的forkExec()函数调用只发生。如果脚本/客户端应用程序手动叫做插座()调用适当的执行,事情很好地工作。

NOTE: This ONLY occurs when the script/client app is called using my forkExec() function. If the script/client app is called manually the socket() call performs appropriately and things work fine.

根据这些信息我怀疑这是在我的叉子的东西()execvp()code下面...任何想法?

Based on that information I suspect it's something in my fork() execvp() code below... Any ideas?

void forkExec()
{    
    int stat;

    stat = fork();
    if (stat < 0)
    {
        printf("Error forking child: %s", strerror(errno));
    }
    else if (stat == 0)
    {
        char *progArgs[3];

        /*
         * First, close the file descriptors that the child 
         * shouldn't keep open
         */
        close(ServerFd);
        close(XMLSocket);
        close(ClientFd);
        close(EventSocket);
        close(monitorSocket);

        /* build the arguments for script */
        progArgs[0] = calloc(1, strlen("/path_to_script")+1);
        strcpy(progArgs[0], "/path_to_script");
        progArgs[1] = calloc(1, strlen(arg)+1);
        strcpy(progArgs[1], arg);
        progArgs[2] = NULL; /* Array of args must be NULL terminated for execvp() */

        /* launch the script */
        stat = execvp(progArgs[0], progArgs);
        if (stat != 0)
        {
            printf("Error executing script: '%s' '%s' : %s", progArgs[0], progArgs[1], strerror(errno));
        }
        free(progArgs[0]);
        free(progArgs[1]);
        exit(0);
    }

    return;
}

客户端应用程序code:

Client app code:

static int connectToServer(void)
{
int socketFD = 0;
int status;
struct sockaddr_in address;
struct hostent* hostAddr = gethostbyname("localhost");

socketFD = socket(PF_INET, SOCK_STREAM, 0);

以上调用返回0。

if (socketFD < 0)
{
    fprintf(stderr, "%s-%d: Failed to create socket: %s", 
                                __func__, __LINE__, strerror(errno));
    return (-1);
}

memset(&address, 0, sizeof(struct sockaddr));
address.sin_family = AF_INET;
memcpy(&(address.sin_addr.s_addr), hostAddr->h_addr, hostAddr->h_length);
address.sin_port = htons(POLLING_SERVER_PORT);

status = connect(socketFD, (struct sockaddr *)&address, sizeof(address));
if (status < 0)
{
    if (errno != ECONNREFUSED)
    {
        fprintf(stderr, "%s-%d: Failed to connect to server socket: %s",
                   __func__, __LINE__, strerror(errno));
    }
    else
    {
        fprintf(stderr, "%s-%d: Server not yet available...%s",
                   __func__, __LINE__, strerror(errno));
        close(socketFD);
        socketFD = 0;
    }
}

return socketFD;
}

仅供参考

操作系统:Linux

拱门:ARM32

内核:2.6.26

FYI
OS: Linux
Arch: ARM32
Kernel: 2.6.26

推荐答案

插座()返回-1。

返回0表示插座()成功,给了你文件描述符0。我怀疑,你必须关闭文件描述符的人都有文件描述符0,一旦它的关闭到分配的文件描述符的函数调用next将把返回FD 0,因为它是可用的。

A return of 0 means socket() succeeded and gave you file descriptor 0. I suspect that one of the file descriptors that you close has file descriptor 0 and once it's closed the next call to a function that allocated a file descriptor will return fd 0 as it's available.

这篇关于插座(c)中的客户端服务器应用程序返回0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆