Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从不同进程通过套接字(UDP)回复客户端_C++_C_Sockets_Udp - Fatal编程技术网

C++ 从不同进程通过套接字(UDP)回复客户端

C++ 从不同进程通过套接字(UDP)回复客户端,c++,c,sockets,udp,C++,C,Sockets,Udp,我的服务器不是一个“命令处理程序”进程。它通过UDP接收消息,并通过发布的API(进程采用的任何IPC机制)与另一个进程通信,从而将要执行的工作委托给另一个进程。我们的系统有几个协作进程。然后,该API调用的结果从命令处理程序进程发送回客户机 一个命令是控制从另一个进程到客户端生成的数据流(“连接”消息) 这样行吗?我将客户端的IP地址和端口号发送到另一个进程,该进程创建一个新套接字,并执行sendto…我已经跟踪了代码,一切看起来都很好,但客户端在接收时仍然被阻止…我知道如果我从命令处理程序执

我的服务器不是一个“命令处理程序”进程。它通过UDP接收消息,并通过发布的API(进程采用的任何IPC机制)与另一个进程通信,从而将要执行的工作委托给另一个进程。我们的系统有几个协作进程。然后,该API调用的结果从命令处理程序进程发送回客户机

一个命令是控制从另一个进程到客户端生成的数据流(“连接”消息)

这样行吗?我将客户端的IP地址和端口号发送到另一个进程,该进程创建一个新套接字,并执行sendto…我已经跟踪了代码,一切看起来都很好,但客户端在接收时仍然被阻止…我知道如果我从命令处理程序执行sendto,它会收到响应,但不会从新套接字收到响应

下面是一些示例代码:

#define LEN 10000
char buffer[LEN];
int sfd, nsfd, bread, addrsize;
struct sockaddr_in addr;
addrsize = sizeof (struct sockaddr_in);
server.sin_family = AF_INET;
server.sin_port = htons(5200);
server.sin_addr.s_addr = INADDR_ANY;
sfd = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
bind (sfd, (struct sockaddr*)&server, addrsize);
bread = recvfrom(sfd, buffer, LEN, 0, &addr, &addrsize);

/* send IP address and port number through the API to another process */
/* in that other process, I do something like this...addr has the IP
 * address and port in it from above: */

nsfd = socket (AF_INET, SOCK_DGRAM, IPROTO_UDP);
sendto(nsfd, buff, bread, 0, &addr, sizeof(addr));

所以请帮忙

您应该测试错误返回,比如

if((nsfd = socket (AF_INET, SOCK_DGRAM, IPROTO_UDP)) < 0} {
    perror("at socket open");
    // I'd call exit here, probably
}
if(sendto(nsfd, buff, bread, 0, &addr, sizeof(addr) < 0){
    perror("At sendto");
}
if((nsfd=socket(AF_INET,SOCK_DGRAM,IPROTO_UDP))<0}{
perror(“插座打开时”);
//我可能会叫这里的出口
}
如果(发送到(nsfd、buff、bread、0和addr、sizeof(addr)<0){
perror(“在sendto”);
}
这里有一个很好的教程示例。

您的客户机(或介于两者之间的防火墙)可能会因为从不同的源端口接收响应而感到困惑(因为操作系统只会为新套接字选择一个随机源端口)

解决此问题的一种方法是在服务器中使用SO_REUSEADDR socket选项,并在发送回复时明确绑定到正确的端口。但这也会产生不希望的副作用,即UDP请求可能被重定向到其他进程之一,而不是服务器


另一个选项(如果您使用的是Unix/Linux)是通过Unix域套接字(通过sendmsg和辅助数据)将服务器套接字传递给其他进程。

哪个系统是Linux或Windows?客户端如何工作?它是多主机的吗?它如何处理数据报-recv(),recvfrom()?它是否使用connect()-是的,您可以在UDP上使用它。发送到-我已经测试了此部分(服务器接收请求)。不使用连接我接受你知道服务器工作,数据报失效,没有防火墙问题等。我怀疑的是客户端以及它是如何处理其结束的。感谢Duck-我想我找到了罪魁祸首-sendto返回1-当我尝试发送10512字节时…setsockopt可能?在我编译相同的windows上的服务器,绕过命令处理程序(默认情况下winsock上的SNDBUF大于vxworks?)…嗯…那么错误代码是什么?可能发生的明显情况是权限错误、防火墙拦截随机UDP数据包,以及一端或另一端的某种I/O错误。发送到之前一切正常(无错误代码).那么您同意我应该能够打开第二个套接字并从另一个进程进行答复吗?我不需要从我“recvfrom”的同一个套接字进行答复ed?不,你不知道。但是由于任何进程都可以将数据发送回你的客户端程序,因此程序经常检查它们是否从发送数据的位置接收数据。有几种可能性,其中之一是你的客户端只是丢弃数据,因为你的服务器子进程正在使用不同的端口。说真的,请通读该教程。它也是获取了您想要执行的操作的代码。@Charlie-也许我的问题不清楚-我以前看过类似的教程,问题是“我可以从另一个进程打开的新套接字中回复,还是必须从我接收的套接字中回复?”"'ed.这个例子没有显示服务器的回复,这是我的想法-回复消息的源端口必须是原始消息的目标端口。由于应用程序将只发送,我认为从错误的进程接收不会有问题-我将尝试在发送之前绑定源端口,并查看如果是的话,我会接受这个答案。对不起,cmeerw,但是我尝试这个可能需要一段时间。我从来没有尝试过这个,而且不会尝试,因为我们切换到TCP…所以我会接受这个答案作为最佳答案