Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 连接:非插座上的插座操作_C_Sockets_Unix_Networking - Fatal编程技术网

C 连接:非插座上的插座操作

C 连接:非插座上的插座操作,c,sockets,unix,networking,C,Sockets,Unix,Networking,我是unix网络编程新手,我曾尝试编写一个程序连接到Google的服务器。但是,我在使用connect()函数时出错。(操作系统:OSX) 连接错误:非套接字上的套接字操作 我已经做了4个小时了,但是我没有发现问题所在。这是我的密码: #define SERVPORT 80 int main (int argc, char **argv) { int i, sockfd; struct hostent *host; struct sockaddr_in serv_addr;

我是unix网络编程新手,我曾尝试编写一个程序连接到Google的服务器。但是,我在使用connect()函数时出错。(操作系统:OSX)

连接错误:非套接字上的套接字操作

我已经做了4个小时了,但是我没有发现问题所在。这是我的密码:

#define SERVPORT 80

int main (int argc, char **argv)
{
  int i, sockfd;
  struct hostent *host;
  struct sockaddr_in serv_addr;

  if ( (host = gethostbyname(argv[1])) == NULL) {
    printf("gethostbyname error\n");
    exit(1);
  }

  for (i = 0; host->h_addr_list[i]; i++) {
    if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1)) {
    printf("socket error\n");
    exit(1);
    }

    bzero(&serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(SERVPORT);
    serv_addr.sin_addr = *( (struct in_addr *)host->h_addr_list[i]);
    const char *ip = inet_ntoa(serv_addr.sin_addr);
    printf("connect to %s\n", ip);

    if (connect(sockfd, (struct sockaddr *) &serv_addr,
            sizeof(struct sockaddr)) == -1) {
      printf("connect error:%s\n", strerror(errno));
      exit(1);
    }

 }
  return 0;
}

我明白问题所在。是这样的:

if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1))
==运算符的优先级高于=运算符。仔细看一下你在这个表达式上构造括号的方式,看看我的意思。由于分配了布尔表达式(socket(…)=-1),sockfd正在初始化为“0”

将套接字初始化更改为:

  for (i = 0; host->h_addr_list[i]; i++) 
  {

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1)
    {
        printf("socket error\n");
        exit(1);
    }
或者,如果您更喜欢在同一行上使用“分配和比较”方法,您可以这样说:

if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

请注意细微的差别。

连接的
socklen\u t
值应该是
sizeof(struct sockaddr\u in)
。您在if中破坏了赋值。调试器将在大约45秒内向您显示这一点。修复括号,或者更好地将赋值移出
if
。如果您使用的是gcc,这是打开
-Wall
的另一个原因,它会给您“警告:建议将赋值周围的括号用作真值”你不认为是时候把操作符优先级记下来了吗?@EJP-我在工作时把操作符优先级表的副本藏在一张3x5卡上。在同一张卡的另一端是“ls”的所有命令行参数和“HelloWorld.c”的列表。我总是忘记是argc还是argv作为main的第一个参数。:)@JonathonReinhart,谢谢你提醒我在离开C 30年后返回C时插入-Wall。它在我之前发现了更多的问题。@selbie我手头有我的K&R(第一版)。优先表见第49页。:)全括号是最安全的,它可以使vi“%”很好地工作,尤其是d%可以杀死表达式中的一个术语。