gpt4 book ai didi

linux - socket() 在 C 客户端服务器应用程序中返回 0

转载 作者:IT王子 更新时间:2023-10-29 00:09:47 25 4
gpt4 key购买 nike

我正在开发一个包含多个服务器套接字的应用程序,每个套接字都在一个唯一的线程中运行。
其中一个线程调用外部实用程序(脚本)。此脚本调用一个实用程序(客户端)向其中一个服务器套接字发送消息。

最初,我使用 system() 来执行这个外部脚本,但我们不能使用它,因为我们必须确保服务器套接字在 fork 执行的子进程中关闭外部脚本。
我现在自己调用 fork()execvp()。我 fork() 然后在 child 中关闭所有服务器套接字,然后调用 execvp() 来执行脚本。

现在,一切正常。问题是脚本有时会向服务器应用程序报告错误。该脚本通过调用另一个打开 TCP 套接字并发送适当数据的应用程序(客户端)来发送这些错误。我的问题是客户端应用程序获取 socket() 系统调用返回的值 0

注意:这仅在使用我的 forkExec() 函数调用脚本/客户端应用程序时发生。如果手动调用脚本/客户端应用程序,socket() 调用会正常执行并且一切正常。

根据这些信息,我怀疑它在我下面的 fork() execvp() 代码中...有什么想法吗?

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

客户端应用程序代码:

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

最佳答案

socket() 出错时返回 -1。

返回 0 意味着 socket() 成功并给你文件描述符 0。我怀疑你关闭的文件描述符之一有文件描述符 0,一旦它关闭,下一次调用分配文件描述符的函数将可用时返回 fd 0。

关于linux - socket() 在 C 客户端服务器应用程序中返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2135159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com