C中非套接字错误的套接字操作

Pra*_*apB 4 c sockets udp

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

没有编译错误,但输出是

Socket Bind Failed: Socket operation on non-socket
To the client: hello,  World
Run Code Online (Sandbox Code Playgroud)

请帮我弄清楚错误在哪里?并帮助摆脱它

alk*_*alk 10

错误信息说明了一切:套接字不是(有效)套接字.

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

if((sock = socket(AF_INET, SOCK_DGRAM, 0) == -1))
Run Code Online (Sandbox Code Playgroud)

上述第一代码进行比较的调用的结果socket(),以-1及然后之比较到的结果分配sock.所以它是0或者1.并且调用的结果socket()丢失了.

代码应如下所示:

if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
Run Code Online (Sandbox Code Playgroud)

因为==紧紧束缚=.


顺便说一下,使用Yoda-Conditition可以避免这种"拼写错误":

if (-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0)))
Run Code Online (Sandbox Code Playgroud)

此外,至少clen应该socklen_t是传递其地址的类型,以便在其中写入一个值,如果预期的大小socklen_t不同于int (显示的代码通过),则将失败.

  • 好眼力.一旦修复,下一个致命错误是UB,因为recvbuf未初始化使用. (2认同)

pax*_*blo 9

if((sock = socket(AF_INET, SOCK_DGRAM, 0) == -1))
//         \__________________________________/
Run Code Online (Sandbox Code Playgroud)

你的括号在错误的地方.它设置sock为真/假值,因为==它比"更具约束力" =.它应该是:

if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
//  \_____________________________________/
Run Code Online (Sandbox Code Playgroud)

设置sock为返回值socket(),然后将其与之比较-1.

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