int main_s6()
{
// 创建套节字
DWORD dwThread_ms;
HANDLE h_thread;
char ip_temp[128] = {0};
char port_temp_i[32] = {0};
int port_temp_a = 0;
printf("Please input the ip address, Defaults is ::1\n->");
getchar();
gets_s(ip_temp);
if(strlen(ip_temp) == 0)
strcpy_s(ip_temp, sizeof(ip_temp), ip_add6);
printf("\nPlease input the port number, Defaults is 50002\n->");
gets_s(port_temp_i);
if(strlen(port_temp_i) == 0)
strcpy_s(port_temp_i, sizeof(port_temp_i), port_num6);
port_temp_a = atoi(port_temp_i);
SOCKET sListen = ::socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP);
//用来指定套接字使用的地址格式,通常使用AF_INET
//指定套接字的类型,若是SOCK_DGRAM,则用的是udp不可靠传输
//配合type参数使用,指定使用的协议类型(当指定套接字类型后,可以设置为0,因为默认为UDP或TCP)
if(sListen == INVALID_SOCKET)
{
printf("Failed socket() \n");
return 0;
}
sockaddr_in6 sin6;
//bzero(&sin6,sizeof(sin6));
sin6.sin6_family = PF_INET6;
sin6.sin6_port = htons(port_temp_a); //1024 ~ 49151:普通用户注册的端口号
//sin6.sin6_addr = inet_ntop(ip_temp);
sin6.sin6_addr = in6addr_any;
inet_pton(PF_INET6,ip_temp,&sin6.sin6_addr);
printf("inet_pton: 0x%x\n", sin6.sin6_addr);
// 绑定这个套节字到一个本地地址
if(::bind(sListen, (LPSOCKADDR)&sin6, sizeof(sin6)) == SOCKET_ERROR)
{ //printf("%d\n",sizeof(sin6));
printf(" error:%d\n", WSAGetLastError());
printf("Failed bind() \n");
return 0;
}
// 进入监听模式
//2指的是,监听队列中允许保持的尚未处理的最大连接数
if(::listen(sListen, 2) == SOCKET_ERROR)
{
printf("Failed listen() \n");
return 0;
}
// 循环接受客户的连接请求
sockaddr_in6 remoteAddr;
int nAddrLen = sizeof(remoteAddr);
//SOCKET sClient = 0;
printf("waiting for client...\n");
while(sClient == 0)
{
// 接受一个新连接
//((SOCKADDR*)&remoteAddr)一个指向sockaddr_in结构的指针,用于获取对方地址
sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
if(sClient == INVALID_SOCKET)
{
printf("Failed accept()");
}
printf("link successfully\nclient's IP:%s \r\n", inet_ntop(AF_INET6,&remoteAddr.sin6_addr,ip_temp,sizeof(ip_temp)));
continue;
}
h_thread = CreateThread(NULL, 0, _m, NULL, 0, &dwThread_ms);
CloseHandle(h_thread);
recv_s();
// 关闭同客户端的连接
::closesocket(sClient);
// 关闭监听套节字
::closesocket(sListen);
return FALSE;
}