Connect: Socket operation on non-socket
I see the problem. It's this line:
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1))
The == operator has precedence over the = operator. Look at the way you have the parentheses structured on that expression a bit more carefully to see what I mean. sockfd is getting initialize to "0" as a result of being assigned a boolean expression (socket(...) == -1).
Change the socket initialization to this:
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);
}
Or if you prefer the "assign and compare" on the same line approach, you can probably say this:
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
Notice the subtle difference.
Nmzzz
Updated on February 06, 2020Comments
-
Nmzzz over 4 years
I'm new to unix network programming and I have tried to write a program to connect to Google's server. However, I got a error while using the connect() function. (OS: OS X)
Connect error: Socket operation on non-socket
I have worked at it for 4 hours but I could not find out the problem. Here is my code:
#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; }