【问题标题】:Socket API :Socket operation on non-socketSocket API:非套接字上的套接字操作
【发布时间】:2015-02-26 23:22:54
【问题描述】:

您好,我在使用套接字 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;}

【问题讨论】:

  • 如果你得到一个错误,(a) 不要只打印一些你自己设计的消息:使用perror()strerror(),并且(b) 不要继续,就像错误一样没有发生。并且测试!= 0 的系统调用是不正确的:正确的测试是== -1&lt; 0

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


【解决方案1】:

行:

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

没有按照你的想法去做。如果您仔细观察括号的位置(并记住 &lt; 运算符的优先级高于 =),您会注意到您实际上是在为 sd 分配表达式 socket(PF_INET, SOCK_STREAM, 0) &lt; 0 的值。

简而言之,sd 很可能最终会包含值 0,因为这就是上述表达式通常的计算结果。这解释了“非套接字上的套接字操作”错误;它真的不是一个套接字。

所以这行应该是:

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

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

【讨论】:

    【解决方案2】:
    addr.sin_port = htonl((u_short)port);
    

    应该阅读

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

    因为端口是16位数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-21
      • 2014-09-10
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多