socket bind函数的声明:
int bind(int sockfd, struct sockaddr * my_addr, int addrlen);
你所谓的bind阻塞,是指程序运行到bind函数这里卡住了确定是bind阻塞,而不是后面的某语句阻塞 另外,你socket开启了REUSE_ADDR选项了没有
socket.bind(SocketAddress bindpoint) 英文:Binds the socket to a local address;If the address is null, then the system will pick upan ephemeral port and a valid local address to bind the socket翻译:将socket绑定到本地地址;如果地址为空,系统会指定一个暂时的端口和合法的本地地址去绑定socket
参考下面:
SOCKET server_socket;
SOCKADDR_IN internet_addr;
int ret, error, addr_len;
PROXY_SOCK_PARAM_T *_param;
HANDLE hThread;
unsigned int thid;
// 创建 socket
server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(server_socket == INVALID_SOCKET) /* 调用 socket 不成功, 返回 INVALID_SOCKET,
调用 WSAGetLastError() 可查看错误代码 */
{
error = WSAGetLastError();
// TODO: 错误处理
return 0;
}
// 进行 Socket 绑定
internet_addr.sin_family = PF_INET;
internet_addr.sin_port = htons(PROXY_SERVER_PORT);
internet_addr.sin_addr.s_addr = htonl(INADDR_ANY);
ret = bind(server_socket, (SOCKADDR *)&internet_addr, sizeof(internet_addr));
if(ret != 0) /* bind 成功返回 0. 否则返回 SOCKET_ERROR, 调用 WSAGetLastError() 可查看错误代码 */
{
error = WSAGetLastError();
closesocket(server_socket);
// TODO: 错误处理
return 0;
}
// 在 socket 上进行监听
ret = listen(server_socket, 128); /* listen 成功返回 0. 否则返回 SOCKET_ERROR,
调用 WSAGetLastError() 可查看错误代码 */
if(ret != 0)
{
error = WSAGetLastError();
closesocket(server_socket);
// TODO: 错误处理
return 0;
}
std::cout << "[PROXY-SERVR] 端口 5200 监听启动..." << std::endl;
// 接收来自客户端的请求
for(;;)
{
// 组织传递给新线程的数据结构
_param = (PROXY_SOCK_PARAM_T *)malloc(sizeof(PROXY_SOCK_PARAM_T));
_param->server_socket = server_socket;
addr_len = sizeof(_param->client_addr);
_param->client_socket = accept( _param->server_socket,
(SOCKADDR *)&(_param->client_addr),
&(addr_len));
if(_param->client_socket == INVALID_SOCKET)
{
error = WSAGetLastError();
// TODO: 错误处理
} else {
// 创建工作线程
hThread = (HANDLE)_beginthreadex(NULL, 0, server_work_thread, (void *)_param, 0, &thid);
if(hThread == INVALID_HANDLE_VALUE)
{
free(_param);
} else {
CloseHandle(hThread);
}
}
}