C Bind()在我的计算机中返回-1,而在其他计算机中则正常运行
我正在使用LinuxMint,我正在尝试开发一个服务器端应用程序,该应用程序将侦听特定端口。我尝试将端口设置为使用C Bind()在我的计算机中返回-1,而在其他计算机中则正常运行,c,sockets,linux-mint,C,Sockets,Linux Mint,我正在使用LinuxMint,我正在尝试开发一个服务器端应用程序,该应用程序将侦听特定端口。我尝试将端口设置为使用htons(0),但仍然存在相同的问题 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <linux/in.h> #include <stdlib.h> #include <unistd.h> #include
htons(0)
,但仍然存在相同的问题
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/in.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
float calculator(char *calculation);
extern int errno;
int main(int argc,char **argv)
{
int clientaddrlen, listenfd, connectfd, bytes_rcvd, listen_queue_size=1;
short int port_no;
char readBuff[1000];
struct sockaddr_in servaddr, clientaddr;
pid_t childpid;
int status;
char sendBuff[1025];
if(argc!=3){
printf("Usage Format: ./server -p <PortNumber>\n");
printf("Sample Run: ./server -p 2000\n");
exit(1);
}
port_no = atoi(argv[argc-1]);
printf("Server running at port #%d\n", port_no);
// Create server socket.
if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
fprintf(stderr, "Cannot create server socket! errno %i: %s\n",errno,strerror(errno));
exit(1);
}
printf("Server socket created\n");
// Bind (attach) this process to the server socket.
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(port_no);
errno = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(errno < 0){
printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
exit(1);
}
这就在bind系统调用之后,出于某种原因,bind系统调用在我的系统中返回-1。我的系统是否存在导致此问题的原因?bind()
在内部设置errno
,以防出现故障。不要覆盖它
发件人:
返回值
成功时,返回零。在出现错误时,返回-1,并正确设置errno
那么这个
errno = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(errno < 0){
printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
exit(1);
}
errno=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(错误号<0){
printf(“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
出口(1);
}
应该看起来像:
int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(result < 0) {
fprintf(stderr, "Server bind failure errno %i: %s\n", errno, strerror(errno));
exit(EXIT_FAILURE);
}
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(结果<0){
fprintf(stderr,“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
退出(退出失败);
}
或者更好:
int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof servaddr);
if(result < 0) {
perror("Server - bind() failed");
exit(EXIT_FAILURE);
}
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof servaddr);
如果(结果<0){
perror(“服务器绑定()失败”);
退出(退出失败);
}
注:错误信息应转到标准错误输出。bind()
在故障情况下在内部设置errno
。不要覆盖它
发件人:
返回值
成功时,返回零。在出现错误时,返回-1,并正确设置errno
那么这个
errno = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(errno < 0){
printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
exit(1);
}
errno=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(错误号<0){
printf(“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
出口(1);
}
应该看起来像:
int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(result < 0) {
fprintf(stderr, "Server bind failure errno %i: %s\n", errno, strerror(errno));
exit(EXIT_FAILURE);
}
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(结果<0){
fprintf(stderr,“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
退出(退出失败);
}
或者更好:
int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof servaddr);
if(result < 0) {
perror("Server - bind() failed");
exit(EXIT_FAILURE);
}
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof servaddr);
如果(结果<0){
perror(“服务器绑定()失败”);
退出(退出失败);
}
注:错误信息应转到标准错误输出。bind()
在故障情况下在内部设置errno
。不要覆盖它
发件人:
返回值
成功时,返回零。在出现错误时,返回-1,并正确设置errno
那么这个
errno = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(errno < 0){
printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
exit(1);
}
errno=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(错误号<0){
printf(“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
出口(1);
}
应该看起来像:
int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(result < 0) {
fprintf(stderr, "Server bind failure errno %i: %s\n", errno, strerror(errno));
exit(EXIT_FAILURE);
}
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(结果<0){
fprintf(stderr,“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
退出(退出失败);
}
或者更好:
int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof servaddr);
if(result < 0) {
perror("Server - bind() failed");
exit(EXIT_FAILURE);
}
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof servaddr);
如果(结果<0){
perror(“服务器绑定()失败”);
退出(退出失败);
}
注:错误信息应转到标准错误输出。bind()
在故障情况下在内部设置errno
。不要覆盖它
发件人:
返回值
成功时,返回零。在出现错误时,返回-1,并正确设置errno
那么这个
errno = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(errno < 0){
printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
exit(1);
}
errno=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(错误号<0){
printf(“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
出口(1);
}
应该看起来像:
int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(result < 0) {
fprintf(stderr, "Server bind failure errno %i: %s\n", errno, strerror(errno));
exit(EXIT_FAILURE);
}
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(结果<0){
fprintf(stderr,“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
退出(退出失败);
}
或者更好:
int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof servaddr);
if(result < 0) {
perror("Server - bind() failed");
exit(EXIT_FAILURE);
}
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof servaddr);
如果(结果<0){
perror(“服务器绑定()失败”);
退出(退出失败);
}
注意:错误信息应转到标准错误输出。我使用的是错误无误。它是在
bind()
函数中内部设置的,我需要设置一个不同的变量来存储bind()
的返回值
因此,将我的代码更改为:
int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(result < 0)
{
printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
exit(-1);
}
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(结果<0)
{
printf(“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
出口(-1);
}
我找到了真正的errno
,它是13
Errorno 13表示权限被拒绝
在我的系统中,
1080
下的端口是为root用户保留的,这就是我出错的原因。而在其他系统中,它必须超过1024。我不知道为什么htons(0)
会出错,但当我将端口改为2000
而不是1025
时,它工作了。为了使用1080以下的端口,我必须使用sudo
运行应用程序 我用错了。它是在bind()
函数中内部设置的,我需要设置一个不同的变量来存储bind()
的返回值
因此,将我的代码更改为:
int result = bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(result < 0)
{
printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
exit(-1);
}
int result=bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
如果(结果<0)
{
printf(“服务器绑定失败错误号%i:%s\n”,错误号,strerror(错误号));
出口(-1);
}
我找到了真正的errno
,它是13
Errorno 13表示权限被拒绝
在我的系统中,1080
下的端口是为root用户保留的,这就是我出错的原因。在