- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用c语言构建一个多客户端UDP服务器,但是当我尝试从系统连接到我的服务器时,我收到此错误gethostbyaddr上的错误:成功请找到下面的服务器代码。我已经尝试了类似问题的解决方案( gethostbyaddr() returns NULL but errno result in SUCCESS ),但我无法让它工作。任何帮助将不胜感激
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define BUFSIZE 1024
/*
* error - wrapper for perror
*/
void error(char *msg) {
perror(msg);
exit(1);
}
int main(int argc, char **argv) {
int sockfd; /* socket */
int portno; /* port to listen on */
int clientlen; /* byte size of client's address */
struct sockaddr_in serveraddr; /* server's addr */
struct sockaddr_in clientaddr; /* client addr */
struct hostent *hostp; /* client host info */
char buf[BUFSIZE]; /* message buf */
char *hostaddrp; /* dotted decimal host addr string */
int optval; /* flag value for setsockopt */
int n; /* message byte size */
FILE *fp; /* file variable */
char str[10];
int i = 0;
char userlist[10];
int array_size;
char line[256];
int cred,flag;
/*
* check command line arguments
*/
if (argc != 2) {
fprintf(stderr, "usage: %s <port>\n", argv[0]);
exit(1);
}
portno = atoi(argv[1]);
/*
* socket: create the parent socket
*/
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
/* setsockopt: Handy debugging trick that lets
* us rerun the server immediately after we kill it;
* otherwise we have to wait about 20 secs.
* Eliminates "ERROR on binding: Address already in use" error.
*/
optval = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
(const void *)&optval , sizeof(int));
/*
* build the server's Internet address
*/
bzero((char *) &serveraddr, sizeof(serveraddr));
memset(&serveraddr,0,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons((unsigned short)portno);
/*
* bind: associate the parent socket with a port
*/
if (bind(sockfd, (struct sockaddr *) &serveraddr,
sizeof(serveraddr)) < 0)
error("ERROR on binding");
/*
* main loop: wait for a datagram, then echo it
*/
clientlen = sizeof(clientaddr);
while (1) {
/*
* recvfrom: receive a UDP datagram from a client
*/
bzero(buf, BUFSIZE);
n = recvfrom(sockfd, buf, BUFSIZE, 0,
(struct sockaddr *) &clientaddr, &clientlen);
if (n < 0)
error("ERROR in recvfrom");
/*
* gethostbyaddr: determine who sent the datagram
*/
hostp = gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr,
sizeof(clientaddr.sin_addr.s_addr), AF_INET);
if (hostp == NULL)
error("ERROR on gethostbyaddr");
hostaddrp = inet_ntoa(clientaddr.sin_addr);
if (hostaddrp == NULL)
error("ERROR on inet_ntoa\n");
printf("server received datagram from %s (%s)\n",
hostp->h_name, hostaddrp);
printf("server received %d/%d bytes: %s\n", strlen(buf), n, buf);
fp = fopen("users.txt", "r");
while (fgets(line, sizeof(line), fp)) {
//printf("%s\n",line);
cred = strncmp(buf,line,strlen(line)-1);
//printf("%d",strlen(line)-1);
if(cred == 0){
printf("Authenticated....");
flag = 1;
break;
}
else{
printf("Invalid username/password");
}
}
fclose(fp);
最佳答案
gethostbyaddr()
需要一个指向 struct in_addr
的指针作为第一个参数,对于您显示的代码,该参数将为 &clientaddr.sin_addr
。
形成相关(Linux)文档(man gethostbyaddr
):
<小时/>[...] The host address argument is a pointer to a struct of a type depending on the address type, for example a struct in_addr * (probably obtained via a call to inet_addr(3)) for address type AF_INET.
gethostbyaddr()
在 h_errno
中设置错误代码,而不是在 errno
中。
形成相关(Linux)文档(man gethostbyaddr
):
RETURN VALUE
[...[ The gethostbyname() and gethostbyaddr() functions return the hostent structure or a null pointer if an error occurs. On error, the h_errno variable holds an error number.
手册页中也给出了可能的错误代码:
ERRORS
The variable h_errno can have the following values:
HOST_NOT_FOUND
The specified host is unknown.
NO_ADDRESS or NO_DATA
The requested name is valid but does not have an IP address.
NO_RECOVERY
A nonrecoverable name server error occurred.
TRY_AGAIN
A temporary error occurred on an authoritative name server. Try again later.
关于c - gethostbyaddr : Success 上出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39695078/
我有一个使用此功能的 django 应用程序,我正在尝试获取访问我的应用程序的 IP 地址的计算机名称。我正在使用 django-ipware 来执行此操作要获取客户端的 IP 地址,这部分工作正常。
我使用以下代码,结果是正确的,但 gethostbyaddr 需要大约 30 秒。 function IPAddrToName(IPAddr: string): string; var So
我正在为 telnet 客户端编写 C++ 代码。我在从用户输入中获取主机地址时遇到问题。 struct in_addr peers; cin>>peers; peerserver = gethost
#include #include #include #include #include int main () { in_addr ip; ip.s_addr = inet
出于某种原因 valgrind 不断抛出以下错误: ==6263== Invalid read of size 4 ==6263== at 0x40151B9: (within /lib/ld-
我正在提供一个IP地址:64.78.58.91,我想使用GetHostByAddr()win32 API检索主机名。 而不是返回www.ripcode.com,而是返回了intermedia.net
我正在尝试在 Google App Engine - Python 中使用 gethostbyaddr。 我有 import socket 然后 class BeatMail(webapp.Reque
我确实是 C 和套接字的初学者。我知道我不应该使用 gethostbyaddr 因为这是为了考试所以我必须使用他们告诉我使用的东西......我在 Linux 机器 (Ubuntu 14.04) 上使
我正在用c语言构建一个多客户端UDP服务器,但是当我尝试从系统连接到我的服务器时,我收到此错误gethostbyaddr上的错误:成功请找到下面的服务器代码。我已经尝试了类似问题的解决方案( geth
我想从主机名中获取 fqdn。我在 Linux 服务器上执行此命令:python -c “导入 sys、套接字;sys.stdout.write(socket.gethostbyaddr('')[0]
我有一个脚本可以从一个文件中读取地址并使用 socket.gethostbyaddr 查找它的主机名,但是这个函数的返回是困惑的并且看起来不正确。 写入目标文件的行是: destfile.write(
#include #include #include int main(int argc, char **argv) { char *ptr = NULL; struct hos
我知道这个问题之前在这里被问过,我阅读了所有答案,但无法自己解决这个问题。这是交易:我必须编写一个程序,它需要一堆互联网地址(例如 google.com、www.root.cz)并打印出正式名称、备用
socket.gethostbyname()当它的参数是一个真正的主机名时效果很好。但是当它是一个不存在的主机时,我会得到 3 秒的超时,然后是 socket.gaierror: [Errno 110
我正在尝试获取有关 IP 地址为 89.249.207.231 的主机的主机信息。我知道它存在,因为当我在浏览器的 url 字段中键入 IP 地址时,它会找到该页面。这是我的 C 代码。 #inclu
我有一个包含 IP 地址的变量。我正在尝试对其进行 nslookup,而不是返回 DNS 名称,我得到 0。我在 Linux 环境中。目标 IP 来自 vector (字符串 dest_ip = ve
如果我要求 gethostbyaddr() 查找 NAT 生成的 IP 地址,例如 192.168.0.4,我应该期望它起作用吗? 背景:我正在家里对一些用于网络环境的控制代码进行测试。有时,此代码会
为什么 gethostbyaddr($_SERVER['REMOTE_ADDR']) 返回一个 IP 地址,而不是它应该返回的计算机名称。它在办公室的 50 台计算机上按预期工作并返回计算机名称。目前
我有一个 Python 脚本来获取 IP 地址列表的主机名。该脚本在我从一台计算机运行时有效,但从另一台计算机运行时相同的脚本返回错误( [Errno 11004] host not found )。
我编写了一个脚本,该脚本遍历“0”网络(192.168.0。*)中的所有本地IP。 我使用socket.gethostbyaddr(ip_modified_by_the_loop_each_time)
我是一名优秀的程序员,十分优秀!