C - 连接功能 - 无效的参数错误
问题描述:
我正在写一个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);
}
}
答
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。
是你得到的所有错误?尝试使用clang编译以获取更多详细信息。 – drum 2014-11-06 20:36:34
我把你的代码添加到'char hname [] =“google.com”'中,并将端口改为'80',并成功地连接到谷歌...这是在Ubuntu Linux 14.04上完成的。 – TonyB 2014-11-06 20:45:34
'struct sockaddr_in'有五个字段。你只填三个。在使用它之前,我通常会将整个混乱“memset”为0。 – user3386109 2014-11-06 21:01:24