我有一个非常简单的套接字客户端程序,我想用它来ping我的邮件服务器(作为一个例子),以确保它活着并响应。我使用以下代码进行连接:
portno=25;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if (sockfd<0) error("Cannot open socket");
server=gethostbyname(argv[2]);
if (server==NULL) {
printf("Error: No such host exists\n");
exit(3);
}
bzero((char*)&srvr,sizeof(srvr));
srvr.sin_family=AF_INET;
bcopy((char*)&server->h_addr,(char*)&srvr.sin_addr.s_addr,server->h_length);
srvr.sin_port=htons(portno);
if (connect(sockfd,(struct sockaddr*)&srvr,sizeof(srvr)) <0) error("Error connecting");
我在命令行上传递服务器名称(作为localhost)作为第二个参数。它总是挂在连接呼叫中。我也试图连接到google的一个邮件服务器,结果相同。
我能够在本地服务器和谷歌服务器上远程登录到端口25,并发出HELO命令并获得响应。我以root身份运行程序。
我不确定如何继续进行以确定问题。任何帮助将不胜感激。
答案 0 :(得分:0)
代码显然不完整。您可能希望进行一些调试消息传递,包括检查gethostbyname()
的正确输入。
您通常应使用IPPROTO_TCP作为协议,而不是0。
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
您可能希望使用strace
之类的工具来查看有关系统调用的详细信息。
使用getaddrinfo()
通常会更好。
const char *node = "www.fedoraproject.org";
const char *service = "http";
struct addrinfo hints = {
.ai_family = AF_UNSPEC,
.ai_socktype = SOCK_STREAM,
.ai_protocol = IPPROTO_TCP,
.ai_flags = AI_ADDRCONFIG,
.ai_canonname = NULL,
.ai_addr = NULL,
.ai_next = NULL
};
struct addrinfo *result;
int error;
error = getaddrinfo(node, service, &hints, &result);
struct addrinfo *item;
int sock;
for (item = result; item; item = item->ai_next) {
sock = socket(item->ai_family, item->ai_socktype, item->ai_protocol);
if (sock == -1)
continue;
if (connect(sock, item->ai_addr, item->ai_addrlen) != -1) {
fprintf(stderr, "Connected successfully.");
break;
}
close(sock);
}
freeaddrinfo(result);