套接字编程,bind()错误

时间:2017-08-15 02:41:08

标签: c sockets unix

我为服务器实现编写的代码无效。 程序无法bind()套接字地址正确并生成错误。

代码

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<stdlib.h>
#include <netdb.h>

int main(int argc , char* argv[])
{
    int socket_descriptor;
    struct sockaddr_in server;
    char buffer[512];
    int rval;
    int socket_a;

    if(socket_descriptor = socket(AF_INET, SOCK_STREAM , 0) < 0)
    {
        perror("Error at creating the socket");
        exit(1);
    }

    server.sin_family  = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(5000);

    if(bind(socket_descriptor,(struct sockaddr * )&server,sizeof(server)) < 0)
    {
        perror("Error at binding");
        exit(1);
    }

}

错误

绑定错误:非套接字上的套接字操作

1 个答案:

答案 0 :(得分:6)

这是你的问题:

if(socket_descriptor = socket(AF_INET, SOCK_STREAM , 0) < 0)

小于运算符<的优先级高于赋值运算符=。所以上面相当于:

if(socket_descriptor = (socket(AF_INET, SOCK_STREAM , 0) < 0))

假设socket成功,返回的文件描述符将不是负数,因此比较将评估为0(即false),然后将该值分配给socket_descriptor。由于文件描述符0为stdin,因此您会收到有关非套接字上的套接字操作的错误。

添加正确的括号组会将套接字分配给socket_descriptor

if ((socket_descriptor = socket(AF_INET, SOCK_STREAM , 0)) < 0)