首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

TCP 端口复用,该如何处理

2012-04-23 
TCP 端口复用这个代码主要是监听80端口.已经设置了SO_REUSERADDR了.在浏览器里面输入127.0.0.1,但是程序会

TCP 端口复用
这个代码主要是监听80端口.已经设置了SO_REUSERADDR了.在浏览器里面输入127.0.0.1,但是程序会一直挂起.
代码应该是没问题的呀.不知道问题出在了哪里.麻烦大家帮忙看看

C/C++ code
#include <stdio.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>int main(void){    int err;    int s;    struct sockaddr_in server;    int sc;    int buf=1;    struct sockaddr_in client;    socklen_t len=sizeof(struct sockaddr);    char buff[2048];    s=socket(AF_INET,SOCK_STREAM,0);    setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&buf,sizeof(buf));    server.sin_family=AF_INET;    server.sin_port=htons(80);    server.sin_addr.s_addr=htonl(INADDR_ANY);    err=bind(s,(struct sockaddr *)&server,len);    err=listen(s,2);    sc=accept(s,(struct sockaddr *)&client,&len);    read(sc,buff,sizeof(buff));    printf("%s",buff);    return 0;}


[解决办法]
你的代码是基于TCP的socket连接,根本没有http协议的事情,输入127.0.0.1怎么可能会有相应
[解决办法]
。。。如果一个服务只是开放端口那么简单
那我的电脑可就危险了
[解决办法]
SO_REUSEADDR是在TIME_WAIT阶段允许连接到端口的吧,不是你想要的这种多个进程共同占用一个端口。
[解决办法]
你机子上安装web服务端没有,可以装个apache试试
[解决办法]
SO_REUSEADDR和SO_REUSEPORT
SO_REUSEADDR提供如下四个功能:

SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。
SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。
SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。
SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端口捆绑到另一个套接口上。一般来说,这个特性仅在支持多播的系统上才有,而且只对UDP套接口而言(TCP不支持多播)。

SO_REUSEPORT选项有如下语义:

此选项允许完全重复捆绑,但仅在想捆绑相同IP地址和端口的套接口都指定了此套接口选项才性。
如果被捆绑的IP地址是一个多播地址,则SO_REUSEADDR和SO_REUSEPORT等效。 

使用这两个套接口选项的建议:

在所有TCP服务器中,在调用bind之前设置SO_REUSEADDR套接口选项;
当编写一个同一时刻在同一主机上可运行多次的多播应用程序时,设置SO_REUSEADDR选项,并将本组的多播地址作为本地IP地址捆绑。

热点排行