2014-11-06 42 views
0

我正在写一个C程序通过套接字在两个进程之间进行通信,并且出现以下连接函数调用错误。C - 连接功能 - 无效的参数错误

连接::无效参数

什么我在呼叫丢失连接? 任何帮助将会很棒!

这是我的代码 -

void conn(char *hname) 
{ 
    struct hostent *hp; 
    struct sockaddr_in sin; 
    int port = 10000; 
    int s, rc; 

    hp = gethostbyname(hname); 
    if (hp == NULL) { 
     fprintf(stderr, "host not found (%s)\n", hname); 
     exit(1); 
    } 

    s = socket(AF_INET, SOCK_STREAM, 0); 
    if (s < 0) { 
     perror("socket:"); 
     exit(left); 
    } 

    sin.sin_family = AF_INET; 
    sin.sin_port = htons(port); 
    memcpy(&sin.sin_addr, hp->h_addr_list[0], hp->h_length); 

    rc = connect(s, (struct sockaddr *)&sin, sizeof(sin)); 
    if (rc < 0) { 
     perror("connect:"); 
     exit(rc); 
    } 
} 
+1

是你得到的所有错误?尝试使用clang编译以获取更多详细信息。 – drum 2014-11-06 20:36:34

+2

我把你的代码添加到'char hname [] =“google.com”'中,并将端口改为'80',并成功地连接到谷歌...这是在Ubuntu Linux 14.04上完成的。 – TonyB 2014-11-06 20:45:34

+1

'struct sockaddr_in'有五个字段。你只填三个。在使用它之前,我通常会将整个混乱“memset”为0。 – user3386109 2014-11-06 21:01:24

回答

4

struct sockaddr_in实例应该被初始化为零,例如,

struct sockaddr_in sin; 
memset(&sin, '\0', sizeof(sin)); 

在Linux上,EINVAL是不是一个失败的呼叫connect(2)errno的可能值。你在使用哪种操作系统?

此外,socket的第一个参数是协议族。历史上,在BSD上,您将使用的常数将为PF_INET而不是AF_INET。在实践中,它们具有相同的价值,至少在RHEL 6中,似乎只有一个不变。但是如果你使用的是BSD-ish系统,你应该使用PF_INET。