<分区>
测试TCP很容易,那么UDP呢?这里:Check if OpenVPN UDP Port is open我读到这是不可能的。但是,这里:How to retrieve both TCP and UDP ports with Nmap?事实证明 nmap 可以做到这一点,所以我认为这是可能的。
我写了一段很简单的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char **argv)
{
char * ip_addr;
int port;
int sockfd;
struct sockaddr_in server_addr;
if (argc != 3)
{
fprintf(stderr,"Usage: %s IP port \n", argv[0]);
exit(1);
}
ip_addr = argv[1];
port = atoi(argv[2]);
if (port <= 0)
{
fprintf(stderr,"error: invalid port\n");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
inet_aton(ip_addr, &server_addr.sin_addr);
char msg[] = "Just a text\n";
char buffer[255];
int recv_size, send_size;
if ((send_size = sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr*) &server_addr, sizeof(server_addr))) < 0)
{
close(sockfd);
if (errno != 0)
{
perror("send");
exit(1);
}
}else if(send_size == 0)
{
printf("sent\n");
}
else if (send_size > 0)
{
printf("sent\n");
}
if ((recv_size = recvfrom(sockfd, buffer, 255, 0, NULL, NULL)) == 0)
{
close(sockfd);
if (errno != 0)
{
perror("recv");
exit(1);
}
}
buffer[recv_size] = '\0';
close(sockfd);
return 0;
}
但它什么也不打印,只是结束。所以很难说发生了什么,端口是否打开。有没有简单的方法,使用套接字,来测试远程UDP端口是否打开?