套接字API:非套接字上的套接字操作

时间:2015-02-26 23:22:54

标签: c++ c sockets network-programming bsd

您好我在使用socket api编写服务器时遇到问题。我总是得到这个错误:"非套接字上的套接字操作"

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;}

2 个答案:

答案 0 :(得分:1)

该行:

if ((sd = socket(PF_INET, SOCK_STREAM, 0) < 0)) {

不做你的想法。如果仔细查看括号的位置(并记住<运算符的优先级高于=),您会发现实际上正在为sd赋予表达式socket(PF_INET, SOCK_STREAM, 0) < 0的值1}}。

简而言之,sd很可能最终会包含值0,因为这是上述表达式通常会评估的内容。这解释了非套接字&#34;套接字操作。错误;它真的不是一个插座。

所以该行应为:

if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {

注意我是如何将两个标记左侧的右括号移位。

答案 1 :(得分:0)

addr.sin_port = htonl((u_short)port);

应该阅读

addr.sin_port = htons((u_short)port);

因为端口是16位数。