Sockets UDP套接字没有响应
我正在编写一个c 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[])
#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