启动服务端,让系统自动分配端口后,并把这个端口号告诉客户端,以便于客户端连接.
在bind(...)函数后使用getsockname(...)就可以获取此端口号, 代码如下:
#include <iostream>
#include <windows.h>
using namespace std;
#define PORT 0
#define IP_ADDRESS "127.0.0.1"
#if 1
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
#else
int main(int argc, char * argv)
#endif
{
WSADATA wd;
SOCKET theSock;
struct sockaddr_in theSockAddr;
int ret = 0;
int addrLen = 0;
//Init Windows Socket
if ( WSAStartup(MAKEWORD(2,2), &wd) != 0 )
{
cout << "Init Windows Socket Failed::" << GetLastError() << endl;
return -1;
}
//Create Socket
theSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if ( theSock == INVALID_SOCKET )
{
cout << "Create Socket Failed::" << GetLastError() << endl;
return -1;
}
theSockAddr.sin_family = AF_INET;
theSockAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
theSockAddr.sin_port = htons(PORT);
memset(theSockAddr.sin_zero, 0x00, 8);
//Bind Socket
ret = bind(theSock, (struct sockaddr*)&theSockAddr, sizeof(theSockAddr));
if ( ret != 0 )
{
cout << "Bind Socket Failed::" << GetLastError() << endl;
return -1;
}
// Get bind port number
{
struct sockaddr_in anotherSockAddr;
int len = sizeof(anotherSockAddr);
getsockname(theSock,(sockaddr *)&anotherSockAddr,&len);
unsigned short newPort = ntohs(anotherSockAddr.sin_port);
cout << "Bind Socket value is " << newPort << endl;
}
closesocket(theSock);
WSACleanup();
return 0;
}
1234

被折叠的 条评论
为什么被折叠?



