使用fcntl有一个代码sinppet,但在链接时会遇到麻烦:
#include <poll.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <fcntl.h>
int main()
{
struct addrinfo hints, *ai, *cur_ai;
int port, fd = -1;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
char portstr[10];
char hostname[] = "www.google.com";
snprintf(portstr, sizeof(portstr), "%d", port);
int ret = getaddrinfo(hostname, portstr, &hints, &ai);
if(ret)
{
printf("die");
return ;
}
printf("getaddrinfo !!!");
cur_ai = ai;
fd = socket(cur_ai->ai_family, cur_ai->ai_socktype, cur_ai->ai_protocol);
fcntl(fd, F_SETFL, fcnt(fd, F_GETFL) | O_NONBLOCK);
ret = connect(fd, cur_ai->ai_addr, cur_ai->ai_addrlen);
}
我在macos中编译了它:
qty:socket_lab qrtt1$ gcc main.c
Undefined symbols for architecture x86_64:
"_fcnt", referenced from:
_main in ccCndweM.o
(maybe you meant: _fcntl)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
如何配置它以成功通过编译? 我的GCC版本是:
qty:socket_lab qrtt1$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
答案 0 :(得分:1)
如果您查看链接器返回的错误,您应该会在您的代码中看到问题,当您最有可能使用fcnt
时fcntl
。{/ p>