C客户端套接字程序超时

时间:2014-04-05 22:35:53

标签: c sockets

我有一个非常简单的套接字客户端程序,我想用它来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身份运行程序。

我不确定如何继续进行以确定问题。任何帮助将不胜感激。

1 个答案:

答案 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);

请参阅:https://fedoraproject.org/wiki/Networking/NameResolution#Connecting_to_services_using_getaddrinfo.28.29