编程C:将地址和端口绑定到套接字时出错
我真的不知道我做错了什么。我包括了所有好的图书馆。并在我的VPS和本地Ubuntu安装上进行了测试。我还查找了同一程序的其他代码。但我一直收到“错误:无法将internet地址绑定到套接字方法”消息。 这是我的TCP服务器的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&
#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)由于某种原因,我不得不对1024下的端口使用root权限
有人能解释一下原因吗
感谢您的帮助所有:D如果bind()
失败,请检查errno
。检查错误时,请使用peror
而不是printf
。这将打印出最后一个失败命令的错误字符串。此行缺少一些内容sockfd=(AF_INET,SOCK_STREAM,0)代码>你认为“坏的库”是什么?您应该只包含实际使用的库的头。是否存在只允许root在<1024的端口上绑定的限制?(魔鬼端口符合条件)。@tr0ubl3您是否以root权限运行该程序?否则,您必须选择1024以上的端口号才能成功。