Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Sockets UDP套接字没有响应_Sockets_Udp - Fatal编程技术网

Sockets UDP套接字没有响应

Sockets UDP套接字没有响应,sockets,udp,Sockets,Udp,我正在编写一个c udp套接字的示例。 这是客户 #include <stdlib.h> #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <string.h> #include <arpa/inet.h> int main(int argc, char *argv[])

我正在编写一个c udp套接字的示例。 这是客户

#include <stdlib.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <arpa/inet.h>

int
main(int argc, char *argv[]) {
    if (argc < 3) {
        fprintf(stderr, "Usage: %s ip port\n", argv[0]);
        exit(1);
    }

    int sock;
    char *server_ip;
    unsigned short server_port;
    struct sockaddr_in cliAddr, serAddr;

    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)  {
        fprintf(stderr, "socket failed\n");
        exit(1);
    }

    server_ip = argv[1];
    server_port = atoi(argv[2]);

    memset(&cliAddr, 0, sizeof(cliAddr));
    cliAddr.sin_family = AF_INET;
    cliAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    cliAddr.sin_port = htons(21152);

    if (bind(sock, (struct sockaddr *) &cliAddr, sizeof(struct sockaddr)) < 0) {
        fprintf(stderr, "bind failed\n");
        exit(1);
    }

    memset(&serAddr, 0, sizeof(serAddr));
    serAddr.sin_family = AF_INET;
    serAddr.sin_addr.s_addr = inet_addr(server_ip);
    serAddr.sin_port = htons(server_port);

    if (sendto(sock, "hello", 5, 0, (struct sockaddr *) (&serAddr), sizeof(serAddr)) == -1) {
        fprintf(stderr, "sendto failed\n");
        exit(1);
    }

    printf("send success\n");

    int n;
    char recvstr[50];
    if ((n = recvfrom(sock, &recvstr, 50, 0, NULL, NULL)) < 0) {
        fprintf(stderr, "recvfrom failed\n");
        exit(1);
    }

    printf("receive success: %s\n", recvstr);
    printf("from %s:%d\n", inet_ntoa(serAddr.sin_addr), ntohs(serAddr.sin_port));

    exit(0);
  }
客户将获得:

client ip: 127.0.0.1, client port: 21152
send success
send success
receive success: hello from serverB
from 127.0.0.1:21151
但是当我将ip更改为公共ip时,客户端无法获得响应 从服务器。 客户端将在函数recvfrom处停止


有什么想法吗?

让我猜猜,你是在Mac电脑上运行这个,而防火墙是开着的?默认过滤规则将允许发送UDP并接收响应(客户端),但不允许在开放套接字(服务器)上接收未经请求的数据报

否则您的代码就可以了,尽管您不一定需要绑定(2)套接字的客户端。内核将为源分配下一个可用的高编号端口。如果您计划在给定的客户机和服务器之间进行任何扩展对话,您可以考虑在客户机上使用<代码>连接(2)< /代码>。
您还始终希望显式地将从网络接收的终止字符串归零。不这样做会导致无休止的远程攻击。

谢谢。是的,我在Mac电脑上运行这个。我想写一个udp打孔示例,所以我绑定了套接字的客户端。如何实现?使用函数connect可以实现?通过
connect()
-ing UDP套接字,您不必在每个
send()
上使用目标地址,并且在
recv()
上设置一个过滤器,因此您只需从“已连接”端口获取数据报对等。我保存客户端ip和端口。我可以在新进程中连接到客户端吗?连接-否。您可以只
sendto()
该ip/端口。
send success
receive success: hello from serverB
from 127.0.0.1:21151