Socket API :非套接字上的套接字操作
Socket API :Socket operation on non-socket
您好,我在使用套接字编写服务器时遇到问题 api。我总是收到此错误:"Socket operation on non-socket"
struct sockaddr_in addr;
int port = 10000;
int sd;
memset((char *) &addr,0, sizeof(addr));
addr.sin_family = PF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htonl((u_short)port);
if ((sd = socket(PF_INET, SOCK_STREAM, 0) < 0)) {
printf("socket failed");
}
if(bind(sd, (struct sockaddr *)&addr, sizeof(addr)) != 0)
{
printf(strerror(errno));
}
close(sd);
return 0;}
行:
if ((sd = socket(PF_INET, SOCK_STREAM, 0) < 0)) {
没有按照你的想法去做。如果仔细观察括号的位置(并记住 <
运算符的优先级高于 =
),您会注意到实际上是将表达式 [=] 的值赋给 sd
15=].
简而言之,sd
很可能最终包含值 0,因为这是上面表达式通常计算的结果。这解释了 "socket operation on non-socket" 错误;它真的不是插座。
因此该行应为:
if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
请注意我是如何将右括号左移两个标记的。
addr.sin_port = htonl((u_short)port);
应该阅读
addr.sin_port = htons((u_short)port);
因为端口是16位数字。
您好,我在使用套接字编写服务器时遇到问题 api。我总是收到此错误:"Socket operation on non-socket"
struct sockaddr_in addr;
int port = 10000;
int sd;
memset((char *) &addr,0, sizeof(addr));
addr.sin_family = PF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htonl((u_short)port);
if ((sd = socket(PF_INET, SOCK_STREAM, 0) < 0)) {
printf("socket failed");
}
if(bind(sd, (struct sockaddr *)&addr, sizeof(addr)) != 0)
{
printf(strerror(errno));
}
close(sd);
return 0;}
行:
if ((sd = socket(PF_INET, SOCK_STREAM, 0) < 0)) {
没有按照你的想法去做。如果仔细观察括号的位置(并记住 <
运算符的优先级高于 =
),您会注意到实际上是将表达式 [=] 的值赋给 sd
15=].
简而言之,sd
很可能最终包含值 0,因为这是上面表达式通常计算的结果。这解释了 "socket operation on non-socket" 错误;它真的不是插座。
因此该行应为:
if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
请注意我是如何将右括号左移两个标记的。
addr.sin_port = htonl((u_short)port);
应该阅读
addr.sin_port = htons((u_short)port);
因为端口是16位数字。