Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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数据包的源IP/进程_C_Sockets_Udp - Fatal编程技术网

C 查找UDP数据包的源IP/进程

C 查找UDP数据包的源IP/进程,c,sockets,udp,C,Sockets,Udp,我在C程序中使用recvfrom()从多个客户端接收UDP数据包,这些客户端可以使用自定义用户名登录。一旦他们登录,我希望他们的用户名与唯一的客户端进程配对,这样服务器就可以根据数据包的来源自动知道用户是谁。如何从我使用recvfrom()收到的数据包中获取此信息?\include #包括 #包括 #包括 int main() { int sock=插座(AF INET,sock DGRAM,0); 地址中的结构sockaddr\u; memset(&addr,0,sizeof(addr));

我在C程序中使用
recvfrom()
从多个客户端接收UDP数据包,这些客户端可以使用自定义用户名登录。一旦他们登录,我希望他们的用户名与唯一的客户端进程配对,这样服务器就可以根据数据包的来源自动知道用户是谁。如何从我使用
recvfrom()
收到的数据包中获取此信息?

\include
#包括
#包括
#包括
int main()
{
int sock=插座(AF INET,sock DGRAM,0);
地址中的结构sockaddr\u;
memset(&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
地址:sin_端口=htons(1234);
addr.sin\u addr.s\u addr=INADDR\u ANY;
绑定(sock、reinterpret_cast(&addr)、sizeof(addr));
字符消息[256];
来自中的结构sockaddr_;
socklen\u t fromLen=尺寸of(从);
recvfrom(sock、message、sizeof(message)、0、reinterpret_cast(和from)和fromLen);
char-ip[16];
inet_ntop(AF_inet,&from.sin_addr,ip,sizeof(ip));

std::您是否需要在从recvfrom功能返回的sockaddr结构上使用inet_ntop和ntohs。这很好。但我有一个问题,同一台计算机上的两个客户端应该具有唯一标识符,因此我在末尾添加端口。我在端口上使用ntohs,但无法将其转换为字符*。我如何才能做到这一点?没关系,我使用了
sprintf()
来完成这项工作。谢谢你的帮助!
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <cstring>

int main()
{
  int sock = socket(AF_INET, SOCK_DGRAM, 0);

  struct sockaddr_in addr;
  memset(&addr, 0, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_port = htons(1234);
  addr.sin_addr.s_addr = INADDR_ANY;

  bind(sock, reinterpret_cast<struct sockaddr*>(&addr), sizeof(addr));

  char message[256];
  struct sockaddr_in from;
  socklen_t fromLen = sizeof(from);
  recvfrom(sock, message, sizeof(message), 0, reinterpret_cast<struct sockaddr*>(&from), &fromLen);

  char ip[16];
  inet_ntop(AF_INET, &from.sin_addr, ip, sizeof(ip));

  std::cout << ip << ":" << ntohs(from.sin_port) << " - " << message << std::endl;