入题,谢谢!
解决方案 »
- VC工程执行问题
- vc窗口文本编辑,有错误麻烦帮忙看一下。3Q
- 对话框应用程序怎么响应键盘事件?
- 哪里能找到介绍刻录系统的资料?
- 我要创建这样的切分窗口:先分成两个列在把左边的一列分成两个行,为什么编译时总出错,如果我把右边的一列分成两个行编译就没有问题了?
- 请问向另一个程序发什么消息,可以打开菜单,并选中某一项??
- 请教将二进制代码转化为BCD(或压缩BCD)码的简便方法!要求C语言!谢谢!
- 对话框创建的问题-不执行OnInitDialog()初始化函数
- !!!!!请教数据库的问题
- 关于对话框的问题?搞不定!!您看看吧。。
- 关于 Debug Assertion Failed!
- 请教关于自制窗口
{
#define BUF_LEN 100
bool bOptNODELAY = true;
sockaddr_in addRemote = *((sockaddr_in*)pParam); //ÇëÇóÁ¬½ÓµÄ¿Í»§µØÖ·
sockaddr_in addLocal;
SOCKET skListen = INVALID_SOCKET;
unsigned short nPortLocal = 0;
unsigned short nPortGlobal = 0;
char szBuf[BUF_LEN + 1];
int nMaxListenQueen = 5; printf("%s\tThread Proc Request: Recved connect request IP %s Port %d\n",
GetSystemTimeAsString(), inet_ntoa(addRemote.sin_addr), ntohs(addRemote.sin_port));
//´´½¨Ò»¸ö¾ßÓй̶¨È«¾Ö¶Ë¿ÚµÄsocket
CreateSocketWithGlobalPort(&skListen,
&nPortLocal,
&nPortGlobal,
g_nNATType);
sprintf(szBuf, "%d", nPortGlobal);
::CreateInetAddr(&addLocal, INADDR_ANY, nPortLocal);
//֪ͨ¶Ô·½×Ô¼ºµÄÈ«¾Ö¶Ë¿Ú
printf("%s\tThread Proc Request: Notify My global port may be %d\n",
GetSystemTimeAsString(), nPortGlobal);
::send(g_sktComProxy, szBuf, strlen(szBuf), 0);
//È»ºó¿ªÊ¼¼àÌýÒÔ¼°Ïò¿Í»§·¢ÆðÁ¬½Ó
::listen(skListen, nMaxListenQueen); //½¨Á¢Á¬½ÓµÄ¹ý³Ì
int nConnectCount = 0;
fd_set fdSocket;
timeval tv = {0, 1};
FD_ZERO(&fdSocket);
FD_SET(skListen, &fdSocket); while (true)
{
nConnectCount++;
fd_set fdRead = fdSocket;
int nRet = select(0, &fdRead, NULL, NULL, &tv);
if (SOCKET_ERROR == nRet)
{
printf("%s\tThread Proc Request: Can not accept socket, error code: %d\n", GetSystemTimeAsString(), WSAGetLastError());
}
else if (0 == nRet)
{
//nothing
printf("%s\tThread Proc Request: %d st: did not got the client, send hole punching packet...\n", GetSystemTimeAsString(), nConnectCount);
//²»ÄÜÊÕµ½¿Í»§Á¬½Ó£¬¼ÌÐø·¢ËÍsyn
SOCKET skForHole = INVALID_SOCKET;
::SendAHolePunchingPacket(&skForHole, addRemote, addLocal);
Sleep(3000);
}
else
{
sockaddr_in add;
int nLen = sizeof add;
SOCKET skClient = accept(skListen, (sockaddr*)&add, &nLen);
if (INVALID_SOCKET == skClient)
{
printf("%s\tThread Proc Request: Can not accept socket, error code: %d\n", GetSystemTimeAsString(), WSAGetLastError());
ExitThread(0);
}
else
{
int nLenMsg = 0;
printf("%s\tThread Proc Request: Got Client succed!\n", GetSystemTimeAsString());
sprintf(szBuf, "Hello, tcp connection established!\n");
::send(skClient, szBuf, strlen(szBuf), 0);
while ((nLenMsg = ::recv(skClient, szBuf, BUF_LEN, 0)) > 0)
{
szBuf[nLenMsg] = 0;
printf("%s\tMsg: %s\n", GetSystemTimeAsString(), szBuf);
::send(skClient, szBuf, nLenMsg, 0);
}
printf("%s\tThread Proc Request: Client closed the socket!\n", GetSystemTimeAsString());
closesocket(skClient);
}
break;
}
}
closesocket(skListen);
ExitThread(1);
return 1;
#undef BUF_LEN
}
{
VERIFY(NULL != skt);
bool bOpt = true;
int nMod = 1;
*skt = INVALID_SOCKET;
VERIFY_SOCKET(INVALID_SOCKET != (*skt = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)));
setsockopt(*skt, SOL_SOCKET, SO_REUSEADDR, (char*)&bOpt, sizeof bOpt);
VERIFY_SOCKET(SOCKET_ERROR != (bind(*skt, (sockaddr*)&addLocal, sizeof addLocal)));
//ioctlsocket(*skt, FIONBIO, (unsigned long*)&nMod);
printf("%s\tHole Punching: holing %s %d to remote %s %d ...\n", GetSystemTimeAsString(), inet_ntoa(addLocal.sin_addr),
ntohs(addLocal.sin_port), inet_ntoa(addRemote.sin_addr), ntohs(addRemote.sin_port));
int nRet = connect(*skt, (sockaddr*)&addRemote, sizeof addRemote);
if (SOCKET_ERROR == nRet)
{
printf("%s\tHole Punching: error code: %d\n", GetSystemTimeAsString(), WSAGetLastError());
} ::ForceCloseSocket(skt);
return true;
}