Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编程C:将地址和端口绑定到套接字时出错_C_Sockets_Tcp_Binding_Server - Fatal编程技术网

编程C:将地址和端口绑定到套接字时出错

编程C:将地址和端口绑定到套接字时出错,c,sockets,tcp,binding,server,C,Sockets,Tcp,Binding,Server,我真的不知道我做错了什么。我包括了所有好的图书馆。并在我的VPS和本地Ubuntu安装上进行了测试。我还查找了同一程序的其他代码。但我一直收到“错误:无法将internet地址绑定到套接字方法”消息。 这是我的TCP服务器的C代码: #include <stdio.h> #include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h&

我真的不知道我做错了什么。我包括了所有好的图书馆。并在我的VPS和本地Ubuntu安装上进行了测试。我还查找了同一程序的其他代码。但我一直收到“错误:无法将internet地址绑定到套接字方法”消息。 这是我的TCP服务器的C代码:

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

//Enter The Port and the Ip Address here.

#define PORT 666
#define ADRESS 0

//Enter the amount of Maximum Poeple entering the server.
#define NUMBER_OF_CONNECTIONS 8

int main(){
    int sockfd, newsockfd, portno = 666, clilen;
    char message[1024];
    struct sockaddr_in serv_addr, cli_addr;
    int n;

    sockfd = (AF_INET, SOCK_STREAM, 0);

    if (sockfd < 0){
        printf("ERROR: could not create server-socket.\n");
        exit(1);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));

    // Declaring the port.
    //portno = 666;
    // Declaring the type of connection. (internet connection)
    serv_addr.sin_family =  AF_INET;
    // Declaring the IP.
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    // Declaring the Port.
    serv_addr.sin_port = htons(portno);

    // Binding the Socket?
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0){
        printf("ERROR: could not bind internet address to the socket method.\n");
        exit(1);
    }

    // Entering "Listen Mode".
    listen(sockfd, NUMBER_OF_CONNECTIONS);
    clilen = sizeof(cli_addr);

    // Creating a New Socket for the client.
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

    if (newsockfd < 0){
        printf("ERROR: could not accept connection.\n");
        exit(1);
    }

    //Clearing the message-buffer.
    bzero(message,1024);

    // Reading the message.
    n = read(newsockfd,message,1023);

    if (n < 0){
        printf("ERROR: could not read message.\n");
    }

    printf("Message: %s\n",message);

    n = write(newsockfd, "I got your message.", 18);

    if (n < 0)
    {
        printf("ERROR: sending to client.\n");
    }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
//在此处输入端口和Ip地址。
#定义端口666
#定义地址0
//输入进入服务器的最大人数。
#定义\u连接的数量\u 8
int main(){
int sockfd,newsockfd,端口号=666,clilen;
字符消息[1024];
服务地址中的结构sockaddr\u,cli\u addr;
int n;
sockfd=(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
printf(“错误:无法创建服务器套接字。\n”);
出口(1);
}
bzero((char*)&serv_addr,sizeof(serv_addr));
//声明端口。
//端口号=666;
//声明连接类型。(internet连接)
serv_addr.sin_family=AF_INET;
//声明IP。
serv_addr.sin_addr.s_addr=INADDR_ANY;
//声明端口。
serv_addr.sin_port=htons(端口号);
//绑定套接字?
if(bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0){
printf(“错误:无法将internet地址绑定到套接字方法。\n”);
出口(1);
}
//进入“收听模式”。
监听(sockfd,连接数);
clilen=sizeof(cli_addr);
//为客户端创建新套接字。
newsockfd=accept(sockfd,(struct sockaddr*)&cli\u addr,&clilen);
if(newsockfd<0){
printf(“错误:无法接受连接。\n”);
出口(1);
}
//正在清除消息缓冲区。
bzero(消息,1024);
//阅读信息。
n=已读(newsockfd,message,1023);
if(n<0){
printf(“错误:无法读取邮件。\n”);
}
printf(“消息:%s\n”,消息);
n=写(newsockfd,“我收到你的消息了”,18);
if(n<0)
{
printf(“错误:发送到客户端。\n”);
}
返回0;
}
尝试更换:

sockfd=(AF_INET,SOCK_STREAM,0)


sockfd=socket(AF_INET,SOCK_STREAM,0)

问题在于这一行:

 sockfd = (AF_INET, SOCK_STREAM, 0);
它是有效的,右侧的表达式的计算结果为
0
(请参见C中的逗号运算符)

现在对
bind()
的调用放在fd0上,它通常是一个(伪)终端。这不可能成功

解决办法是:

 sockfd = socket(AF_INET, SOCK_STREAM, 0);
这帮助了我:

当然,更改
sockfd=(AF_INET,SOCK_STREAM,0)
sockfd=socket(AF\u INET,SOCK\u STREAM,0)端口使用root权限

有人能解释一下原因吗


感谢您的帮助所有:D

如果
bind()
失败,请检查
errno
。检查错误时,请使用
peror
而不是
printf
。这将打印出最后一个失败命令的错误字符串。此行缺少一些内容
sockfd=(AF_INET,SOCK_STREAM,0)你认为“坏的库”是什么?您应该只包含实际使用的库的头。是否存在只允许root在<1024的端口上绑定的限制?(魔鬼端口符合条件)。@tr0ubl3您是否以root权限运行该程序?否则,您必须选择1024以上的端口号才能成功。