Tag: 客户端 服务器

将stdout和stderr重定向到套接字以获取分布式shell程序

我制作了一个分布式shell程序,它有一个客户端和服务器。 客户端向服务器发送命令请求,服务器在本地执行该命令,并且应该将该命令的结果输出到客户端。 我无法弄清楚如何将stdout / stderr重定向到客户端。 我使用execvp来执行命令。 我想我可能不得不使用dup2? 但我无法弄清楚如何正确使用它。 有帮助吗?

在C中通过套接字发送struct

我正在开发一个客户端/服务器程序,我的客户端必须向服务器发送消息。 示例消息C结构 : struct Registration { char multicastGroup[24]; pid_t clientPid; }; 用于序列化struct的客户端代码段 struct Registration regn ; regn.clientPid = getpid(); strcpy(regn.multicastGroup, “226.1.1.1”); printf(“PID:%d\n”, regn.clientPid); printf(“MG:%s\n”, regn.multicastGroup); printf(“Size:%d\n”, sizeof(regn)); //Size is 28 data = (unsigned char*)malloc(sizeof(regn)); memcpy(data, &regn, sizeof(regn)); printf(“Size:%d\n”, sizeof(data)); //Size is 4. 用于反序列化数据的服务器代码 if(recvfrom(sd, recvBuf, recvBufSize, 0, (struct sockaddr*)&clientAddr, &len) < 0) { printf("Error receiving […]

如何在C中为客户端提供特定的IP地址

我试图在C中实现一个简单的客户端和服务器,我在网上找不到如何为客户端设置特定IP地址的示例。 这是我到目前为止所得到的: sockfd = socket(PF_INET, SOCK_STREAM, 0); if (sockfd == -1) { } address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(); address.sin_port = htons(); len = sizeof(address); int result = connect(sockfd, (struct sockaddr *)&address, len); 在服务器端,我检查客户端IP地址,我总是得到127.0.0.1 我想改变一些与众不同的东西。

如何防止SIGPIPE或阻止服务器结束?

一个非常标准的C ++ TCP服务器程序,使用pthreads , bind , listen和accept 。 我有一个场景,当我杀死连接的客户端时, 服务器结束 (读取:崩溃)。 崩溃的原因是对文件的write()调用失败,因此程序收到SIGPIPE。 我猜,这会让服务器退出。 我想,“当然,未处理的信号意味着退出”,所以让我们使用signal() : signal(SIGPIPE, SIG_IGN); 因为,取自man 2 write : EPIPE fd连接到读取端关闭的管道或sockets。 当发生这种情况时,写入过程也将收到SIGPIPE信号。 (因此,仅当程序捕获,阻止或忽略此信号时才会看到写入返回值。) 唉,没有。 无论是在服务器线程还是客户端线程中,这似乎都没有帮助。 那么, 如何阻止write()调用引发该信号,或者(务实)如何阻止服务器退出。 我的诊断是: 服务器线程启动,绑定,侦听,接受。 让客户端连接(例如通过telnet) 发送一个pkill telnet来崩溃客户端 不需要的行为:服务器退出,在gdb中 … in write () at ../sysdeps/unix/syscall-template.S:82 82 T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS) 和回溯 : #0 … in write () at ../sysdeps/unix/syscall-template.S:82 […]

close()没有正确关闭套接字

我有一个multithreading服务器(线程池),使用20个线程处理大量请求(一个节点最多500 /秒)。 有一个侦听器线程接受传入连接并将它们排队以供处理程序线程处理。 一旦响应准备就绪,线程就会写出到客户端并关闭套接字。 直到最近,一切似乎都很好,一个测试客户端程序在阅读响应后开始随机挂起。 经过大量挖掘后,似乎服务器的close()实际上并没有断开套接字。 我已经使用文件描述符编号为代码添加了一些调试打印,我得到了这种类型的输出。 Processing request for 21 Writing to 21 Closing 21 close()的返回值为0,否则将打印另一个调试语句。 使用挂起的客户端输出此输出后,lsof将显示已建立的连接。 SERVER 8160 root 21u IPv4 32754237 TCP localhost:9980-> localhost:47530(ESTABLISHED) 客户端17747 root 12u IPv4 32754228 TCP localhost:47530-> localhost:9980(ESTABLISHED) 就像服务器永远不会将关闭序列发送到客户端一样,这种状态会一直挂起,直到客户端被终止,让服务器端处于关闭等待状态 SERVER 8160 root 21u IPv4 32754237 TCP localhost:9980-> localhost:47530(CLOSE_WAIT) 此外,如果客户端指定了超时,它将超时而不是挂起。 我也可以手动运行 call close(21) 在gdb的服务器中,客户端将断开连接。 这可能在50,000个请求中发生一次,但可能不会在较长时间内发生。 Linux版本:2.6.21.7-2.fc8xen Centos版本:5.4(最终版) 套接字动作如下 服务器: […]

如何使用共享内存在进程之间共享信号量

我必须将N个客户端进程与一个服务器同步。 这些进程由一个main函数分叉,我在其中声明了3个信号量。 我决定使用POSIX信号量,但我不知道如何在这些进程之间共享它们。 我认为共享内存应该正常工作,但我有一些问题: 如何在我的细分中分配正确的内存空间? 我可以在shmget size_t字段中使用sizeof(sem_t)来准确分配我需要的空间吗? 有没有人有类似这种情况的例子?