- 论坛徽章:
- 0
|
唉,还是 SO_REUSEADDR ....
我希望构造两个socket,绑定到同一个本地端口。一个监听、一个对外连接。
似乎这是用SO_REUSEADDR可以解决的,可是在我的Solaris 9就是不允许。
同样的代码在Windows和Linux下都试过,达到了我的目的。难道Solaris
不允许这样的行为?
代码:----------------------------------------------------
#include "stdafx.h"
#include <winsock2.h>;
int sock_init()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
sock_init();
SOCKET lhdl, chdl;
sockaddr_in laddr;
BOOL one = TRUE;
laddr.sin_family = AF_INET;
laddr.sin_port = htons(5150);
laddr.sin_addr.s_addr = htonl(INADDR_ANY);
lhdl = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
chdl = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(lhdl, (SOCKADDR*)&laddr, sizeof(laddr));
//++++++++++++++++++++++++++++++++++++++++++++++++
// if we uncomment the setsockopt call, second bind will success
//++++++++++++++++++++++++++++++++++++++++++++++++
// setsockopt(chdl, SOL_SOCKET, SO_REUSEADDR, (const char*)&one,sizeof one);
bind(chdl, (SOCKADDR*)&laddr, sizeof(laddr));
listen(lhdl, 5);
SOCKADDR_IN raddr;
raddr.sin_family = AF_INET;
raddr.sin_port = htons(80);
raddr.sin_addr.s_addr = inet_addr("202.38.215.238" ;
connect(chdl, (SOCKADDR*)&raddr, sizeof(raddr));
// wait for checking port status via netstat
getchar();
WSACleanup();
return 0;
} |
|