【问题标题】:C client socket program timesoutC客户端套接字程序超时
【发布时间】:2014-04-06 07:00:39
【问题描述】:

我有一个非常简单的套接字客户端程序,我想用它来 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)作为第二个参数传递。它总是挂在连接调用中。我也尝试连接到谷歌的邮件服务器之一,结果相同。

我能够远程登录到我的本地服务器和谷歌服务器上的端口 25 并发出 HELO 命令并获得响应。我以root身份运行程序。

我不确定如何进一步确定问题。任何帮助将不胜感激。

【问题讨论】:

  • This 通常被推荐....因为gethostbyname 已过时....
  • @Recker 我知道,我刚刚剪切并粘贴了一些旧代码,因为我认为它可以让我更快地启动和运行。

标签: c sockets


【解决方案1】:

代码显然不完整。您可能需要发送一些调试消息,包括检查 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);

见:https://fedoraproject.org/wiki/Networking/NameResolution#Connecting_to_services_using_getaddrinfo.28.29

【讨论】:

  • 谢谢。我用示例中的新内容更新了我的程序,在我看来现在正在工作。谢谢。
猜你喜欢
  • 2011-07-31
  • 2017-06-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
相关资源
最近更新 更多