【问题标题】:Socket operation on non socket error in CC中非套接字错误的套接字操作
【发布时间】:2014-08-31 10:12:10
【问题描述】:

我是套接字编程的新手...我试过这个服务器端程序

#define BUFLEN 512
#define MYPORT 3456
void errorp(char* msg)
{
        perror(msg);
        exit(1);
}

int main()
{
        struct sockaddr_in server, client;
        int sock;
        int slen = sizeof(server);
        int clen = sizeof(client);
        char *recvbuf, senbuf[BUFLEN] = {'h','e','l','l','o'};

        if((sock = socket(AF_INET, SOCK_DGRAM, 0) == -1))
                errorp("Socket creation failed");


        printf("To the client: %s, %s", senbuf, " World");
        bzero(&server, sizeof(server));

        server.sin_family = AF_INET;
        server.sin_port = MYPORT;
        server.sin_addr.s_addr = inet_addr("127.0.0.1");
        if(bind(sock, (struct sockaddr*)&server, slen)==-1)
                errorp("Socket Bind Failed");
        if(recvfrom(sock, recvbuf, sizeof(recvbuf), 0, (struct sockaddr*) &client, &clen) == -1)
                errorp("recv from error");
        printf("From the client: %s", recvbuf);

        if(sendto(sock, senbuf, sizeof(senbuf), 0, (struct sockaddr*) &client, sizeof(client)) == -1)
                errorp("Error in sending");

        printf("To the client: %s", senbuf);
        close(sock);
        return 0;
}

没有编译错误,但输出是

Socket Bind Failed: Socket operation on non-socket
To the client: hello,  World

请帮我找出错误在哪里? 并帮助摆脱它

【问题讨论】:

  • 旁注:端口号必须转换为网络字节顺序:server.sin_port = htons(MYPORT);
  • "没有编译错误 ..." 但至少如果您使用选项 -Wal -Wextra -pedantic 进行编译,则会出现警告。
  • -Wal 应该是-Wall

标签: c sockets udp


【解决方案1】:

错误消息说明了一切:套接字不是(有效的)套接字。

这应该让你看看创建套接字的代码:

if((sock = socket(AF_INET, SOCK_DGRAM, 0) == -1))

上面的代码第一段将socket()的调用结果与-1进行比较,然后将比较结果赋值给sock。所以它要么是0,要么是1。并且调用socket() 的结果丢失了。

代码应如下所示:

if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)

因为== 绑定比= 更紧密。


顺便说一句,使用Yoda-Conditition 本来可以避免这种“错字”:

if (-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0)))

此外,至少clen 的地址应为socklen_t 类型,以便将值写入其中,如果预期的socklen_t 的大小与@987654337 不同,这将惨遭失败@(显示的代码通过了)。

【讨论】:

  • 很好看。一旦解决了这个问题,下一个致命错误就是 UB,因为 recvbuf 未初始化。
  • @JohnZwinck 但我没有收到任何此类错误.. cud 你解释 wat UB 是什么?
  • @PrathapB:未定义的行为。你的 recvbuf 是垃圾。
  • @JohnZwinck:“你的 recvbuf 是垃圾。”根本不是! ;-)
  • @PrathapB:您可能想在这里阅读:stackoverflow.com/q/2397984/694576
【解决方案2】:
if((sock = socket(AF_INET, SOCK_DGRAM, 0) == -1))
//         \__________________________________/

你的括号放错地方了。它将sock 设置为真/假值,因为===“更具约束力”。它应该是:

if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
//  \_____________________________________/

sock 设置为socket() 的返回值,然后 将其与-1 进行比较。

您也没有 recvbuf 的后备存储,这意味着您的 recvfrom() 一旦开始工作,几乎肯定会做坏事。

【讨论】:

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