精华内容
下载资源
问答
  • Bind error: Address already in use 虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的进程,端口还是使用中,只好每次用...

    在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误:

    Bind error: Address already in use

    虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的进程,端口还是使用中,只好每次用kill结束进程,很是麻烦。昨天晚上无意间浏览到IBM网站上 的一篇题为《Linux 套接字编程中的 5 个隐患》的文章,恍然大悟,今天试了一下,果然解决问题,在此表示感谢,也希望更多的coder看到这篇文章,避免出错。

    主要代码为:


    int on;

    on = 1;
    ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
     现在我每次用Ctrl+C强制结束进程后,用netstat和ps都还能看到端口在使用中,但运行程序不会出现“Address already in use”的错误了,实现了端口的重用。

     

    以下是原文中的第三个隐患--地址使用错误

    地址使用错误(EADDRINUSE)

    您可以使用 bind API 函数来绑定一个地址(一个接口和一个端口)到一个套接字端点。可以在服务器设置中使用这个函数,以便限制可能有连接到来的接口。也可以在客户端设置中使用 这个函数,以便限制应当供出去的连接所使用的接口。bind 最常见的用法是关联端口号和服务器,并使用通配符地址(INADDR_ANY),它允许任何接口为到来的连接所使用。

    bind 普遍遭遇的问题是试图绑定一个已经在使用的端口。该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(bind 返回 EADDRINUSE),它由 TCP 套接字状态 TIME_WAIT 引起。该状态在套接字关闭后约保留 2 到 4 分钟。在 TIME_WAIT 状态退出之后,套接字被删除,该地址才能被重新绑定而不出问题。

    等待 TIME_WAIT 结束可能是令人恼火的一件事,特别是如果您正在开发一个套接字服务器,就需要停止服务器来做一些改动,然后重启。幸运的是,有方法可以避开 TIME_WAIT 状态。可以给套接字应用 SO_REUSEADDR 套接字选项,以便端口可以马上重用。

    考虑清单 3 的例子。在绑定地址之前,我以 SO_REUSEADDR 选项调用 setsockopt。为了允许地址重用,我设置整型参数(on)为 1 (不然,可以设为 0 来禁止地址重用)。


    使用 SO_REUSEADDR 套接字选项避免地址使用错误

     

    int sock, ret, on;
    struct sockaddr_in servaddr;
    /* Create a new stream (TCP) socket */
    sock = socket( AF_INET, SOCK_STREAM, 0 ):
    /* Enable address reuse */
    on = 1;
    ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
    /* Allow connections to port 8080 from any available interface */
    memset( &servaddr, 0, sizeof(servaddr) );
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl( INADDR_ANY );
    servaddr.sin_port = htons( 45000 );
    /* Bind to the address (interface/port) */
    ret = bind( sock, (struct sockaddr *)&servaddr, sizeof(servaddr) );
    在应用了 SO_REUSEADDR 选项之后,bind API 函数将允许地址的立即重用。

     

    Linux 套接字编程中的 个隐患

    http://www.ibm.com/developerworks/cn/linux/l-sockpit/

    展开全文
  • 一:问题:刚开始学习Linux网络编程,第一次使用bind函数出现Cannot assign requested address,错误。在网上找了很多帖子但是都没有解决。 二: 问题一:也就是网上大部分说的:客户端频繁的连服务器,由于每次连接...

    一:问题:刚开始学习Linux网络编程,第一次使用bind函数出现Cannot assign requested address,错误。在网上找了很多帖子但是都没有解决。
    二:
    问题一:也就是网上大部分说的:客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端 口号,所以新的连接没办法绑定端口,即“Cannot assign requested address”。是客户端的问题不是服务器端的问题。
    在这里插入图片描述

    方法一:通过netstat -nap查看当前的状态,的确看到很多TIME_WAIT状态的连接。可以通过pid 用命令 kill -9  pid,杀死处于TIME_WAIT状态的进程。
    
    问题二:因为我的测试是以window当服务器,Ubuntu当客户端,所以需
    

    要用到桥接技术,让两个系统在一个网段里面。那么出现bind的错误很有可能是你的网络的问题。我自己在测试的时候,试了很多种方法,还能ping通,但是网络这一块还是有点问题,还是出现bind错误。
    在这里插入图片描述
    在这里插入图片描述

    解决二:在虚拟机里面,①编辑->虚拟网络编辑器->还原默认设置。②完成后重新选择,网络桥接模式。③进入Ubuntu,命令ifconfig(查看网卡),sudo ifconfig ens33 up (算是打开网卡吧我也不懂),sudo dhclient(动态分配一个IP)。这样就欧克了,就会发现,在同一个网段。就可以使用bind了。
    下面是我写的简单代码,看一下吧。

    服务器端:

    /**********
    1、在服务器端接受消息时知道对方的IP和端口
    	提示:
    		bind出现:Address already in use    方法:netstat -nap查看 用kill -9 pid杀死
    2、利用TCP实现文件传输
    **********/
    
    #include <stdio.h>
    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
    #include <strings.h>
    #include <string.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    
    int main(void)
    {
    	//建立套接字
    	int server_fd=socket(AF_INET,SOCK_STREAM,0);
    	if(server_fd==-1)
    	{
    		perror("socket:");
    		return -1;
    	}
    	//绑定本机的IP和端口
    	struct sockaddr_in saddr;
    	saddr.sin_family=AF_INET;
    	saddr.sin_port=htons(7777);    //设置端口
    	saddr.sin_addr.s_addr=inet_addr("192.168.199.205"); //点分十进制-》换成32位的网络字节序二进制值
    	int ret=bind(server_fd,(struct sockaddr *)&saddr,sizeof(saddr));
    	if(ret==-1)
    	{
    		perror("bind:");
    		return -1;
    	}
    	//设置监听套接字(设置同时来链接数)
    	ret=listen(server_fd,4);		//server_fd设置为监听套接字
    	if(ret==-1)
    	{
    		perror("listen:");
    		return -1;
    	}
    	//等待对端链接
    	struct sockaddr_in client_buf;
    	socklen_t len = sizeof(client_buf);
    	int client_fd = accept(server_fd,(struct sockaddr *)&client_buf,&len);   //成功返回对端的文件描述符
    	if(-1 == client_fd)
    	{
    		perror("accept:");
    		return -1;
    	}
    	//显示对端的ip和端口
    	printf("对端的ip为:%s\n",inet_ntoa(client_buf.sin_addr));
    	printf("对端的port为:%d\n",ntohs(client_buf.sin_port));
    	
    	//文件操作
    	int fd=open("b.txt",O_RDWR | O_CREAT,0777);
    	if(-1 == fd)
    	{
    		printf("open err!\n");
    		return -1;
    	}
    	
    	char buf[20] = {0};
    	while(1)
    	{
    		//第一题
    		/*bzero(buf, 20);
    		read(client_fd, buf, 20);
    		printf("buf:%s\n", buf);
    		*/
    		//第二题
    		bzero(buf, 20);
    		read(client_fd, buf, 20);
    		printf("buf:%s\n", buf);
    		if(!strcmp(buf, "exit"))
    			break;
    		write(fd,buf,strlen(buf));
    		
    	}
    	
    	close(client_fd);
    	close(server_fd);
    }
    

    客户端:

    /**********
    1、在服务器端接受消息时知道对方的IP和端口
    	提示:
    		bind出现:Address already in use    方法:netstat -nap查看 用kill -9 pid杀死
    2、利用TCP实现文件传输
    **********/
    
    #include <stdio.h>
    #include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>
    #include <strings.h>
    #include <string.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    
    int main(void)
    {
    	//建立套接字
    	int client_fd = socket(AF_INET, SOCK_STREAM, 0);
    	if(-1 == client_fd)
    	{
    		perror("socket");
    		return -1;
    	}
    	
    	//链接服务器
    	struct sockaddr_in saddr;
    	bzero(&saddr, sizeof(saddr));
    	saddr.sin_family = AF_INET;
    	saddr.sin_port = htons(7777);
    	saddr.sin_addr.s_addr = inet_addr("192.168.199.205");
    	int ret = connect(client_fd, (struct sockaddr *)&saddr, sizeof(saddr));
    	if(-1 == ret)
    	{
    		perror("connect");
    		return -1;
    	}
    	
    	
    	//文件操作
    	int fd=open("a.txt",O_RDWR | O_CREAT,0777);
    	if(-1 == fd)
    	{
    		printf("open err!\n");
    		return -1;
    	}
    	char fd_buf[20]={0};
    	
    	
    	while(1)
    	{
    		bzero(fd_buf,20);
    		ret = read(fd, fd_buf, 20);  //读文件到缓冲区
    		if(ret==0)
    		{
    			write(client_fd,"exit", 20);
    			break;
    		}
    		else
    		{
    			printf("fd_buf%s\n",fd_buf);
    			write(client_fd, fd_buf, 20);
    		}
    		
    		
    		/*bzero(fd_buf, 20);
    		scanf("%s", fd_buf);
    		write(client_fd, fd_buf, 20);
    		printf("fd_buf:%s\n", fd_buf);
    		if(!strcmp(fd_buf, "exit"))
    			break;*/
    	}
    	
    	close(client_fd);
    
    }
    
    
    
    
    
    展开全文
  • php bin/swoft start启动swoft服务报错如下: 解决方法: 查看80端口:netstat -anp | grep 80 如下可以看到80端口被占用 再输入命令杀死进程:kill 8500 再重启swoft服务:php bin/swoft restart ......

    php bin/swoft start启动swoft服务报错如下:

    解决方法:

    查看80端口:netstat -anp | grep 80  如下可以看到80端口被占用

    再输入命令杀死进程:kill 8500

    再重启swoft服务:php bin/swoft restart 

    已经启动成功啦!!!可以开发项目啦!!

     

     

     

    展开全文
  • Linux socket bind error

    千次阅读 2014-08-31 20:34:32
    Bind error: Address already in use 虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的进程,端口还是使用中,只好每次用kill...
    

    在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误:

    Bind error: Address already in use

    虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的进程,端口还是使用中,只好每次用kill结束进程,很是麻烦。昨天晚上无意间浏览到IBM网站上 的一篇题为《Linux 套接字编程中的 5 个隐患》的文章,恍然大悟,今天试了一下,果然解决问题,在此表示感谢,也希望更多的coder看到这篇文章,避免出错。

    主要代码为:


    int on;

    on = 1;
    ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
     现在我每次用Ctrl+C强制结束进程后,用netstat和ps都还能看到端口在使用中,但运行程序不会出现“Address already in use”的错误了,实现了端口的重用。

     

    以下是原文中的第三个隐患--地址使用错误

    地址使用错误(EADDRINUSE)

    您可以使用 bind API 函数来绑定一个地址(一个接口和一个端口)到一个套接字端点。可以在服务器设置中使用这个函数,以便限制可能有连接到来的接口。也可以在客户端设置中使用 这个函数,以便限制应当供出去的连接所使用的接口。bind 最常见的用法是关联端口号和服务器,并使用通配符地址(INADDR_ANY),它允许任何接口为到来的连接所使用。

    bind 普遍遭遇的问题是试图绑定一个已经在使用的端口。该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(bind 返回 EADDRINUSE),它由 TCP 套接字状态 TIME_WAIT 引起。该状态在套接字关闭后约保留 2 到 4 分钟。在 TIME_WAIT 状态退出之后,套接字被删除,该地址才能被重新绑定而不出问题。

    等待 TIME_WAIT 结束可能是令人恼火的一件事,特别是如果您正在开发一个套接字服务器,就需要停止服务器来做一些改动,然后重启。幸运的是,有方法可以避开 TIME_WAIT 状态。可以给套接字应用 SO_REUSEADDR 套接字选项,以便端口可以马上重用。

    考虑清单 3 的例子。在绑定地址之前,我以 SO_REUSEADDR 选项调用 setsockopt。为了允许地址重用,我设置整型参数(on)为 1 (不然,可以设为 0 来禁止地址重用)。


    使用 SO_REUSEADDR 套接字选项避免地址使用错误

    展开全文
  • 遇到Bind error: Address already in use问题,需要开启SO_REUSEADDR实现地址及端口的复用 添加如下代码在bind()函数之前就可以再次使用服务端关闭前使用的端口 int on = 1; setsockopt( sock, SOL_SOCKET, SO_...
  • bind error : Cannot assign requested address 代码:#include #include #include #include #include #include #include<string.h>static
  • socket tcp 通信 绑定了ip 和 port 正常顺序 客户端发起...再起运行程序的时候 发现bind error:Address already in use 解决办法: //在服务端bind or listen前 unsigned int value = 0x1; set
  • socket Bind error:Address already in use

    千次阅读 2016-06-30 15:50:23
    unix domain socket 与网络socket编程最大的不同在于地址格式不同,用结构体socketaddr_un表示,网络地址是由ip加端口号决定,而domain socket的地址是一个socket类型的文件在文件系统的路径,该文件由bind()函数...
  • C/C++:TCP bind error:Address already in use

    千次阅读 2018-05-14 21:40:47
    C/C++:TCP bind error:Address already in use 在编写、运行服务端程序时,经常会遇到的一个错误是:Address already in use. Address already in use 是在调用bind系统调用时出现的错误。 原因有两个: 1.bind一...
  • Apache Address already in use: make_sock: could not bind to port 80 or 443 error and solution   netstat -tulpn| grep :80   killall -9 httpd
  • 在服务端bind or listen前 unsigned int value = 1; setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(void *)&value,sizeof(value)); 另外参见: http://bbs.csdn.net/topics/330034966 ...
  • 转载自 分享 ...Bind error: Address already in use 虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的...
  • From: http://www.cyberciti.biz/faq/apachehttpdaddress-already-in-use-make_sock-could-not-bind-to-port-80-or-443/ ...Apache Address already in use: make_sock: could not bind to port 80 error and solu
  • E:\Redis> redis-server....[6876] 10 Dec 16:20:52.715 # Creating Server TCP listening socket 127.0.0.1:6379: bind: No error 解决方案如下 按顺序输入如下命令就可以连接成功 1. Redis-cli.exe 2. sh
  • transport error 202: bind failed: 地址已在使用   tomcat启动报错是因为:在catalina.sh中设置了调试启动参数 编辑catalina.sh全局搜索下 address=    去掉或者改一下address端口号,重启...
  • ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98) 解决办法 杀死php-fpm进程然后重新启动,执行如下命令 pkill php-fpm # 杀死进程 php-fpm # 启动 注...
  •  Tomcat Error initializing endpoint java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind  at java.net.PlainSocketImpl.socketBind(Native Method) at java.net.PlainSoc
  • 2019-09-16T06:00:00.349+0000 E NETWORK [initandlisten] Failed to unlink socket file /tmp/mongodb-27017.sock Unknown error 2019-09-16T06:00:00.349+0000 F - [initandlisten] Fatal Assertion 40486 at src/...
  • 今天执行mysql操作的时候出现了错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'问题  1:首先检查是否安装了mysql-server了    sudo apt-...
  • ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use服务器重启后 启动php-fpm报错: 服务器重启后 启动php-fpm报错: php-fpm [root@localhost bin]# /etc/init.d/...
  • service php-fpm restart ERROR: unable to bind listening socket for address ‘127.0.0.1:9000’: Address already in use (98) 执行 killall php-fpm 重启 service php-fpm start

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,605
精华内容 25,042
关键字:

bindsockerror