UDP服务端创建了四个套接字,端口为6000-6003 绑定好后,客户端向服务器其中一个端口发送请求。服务器收到以后保存客户端的SOCKADDR_IN地址。然后客户端分别向服务器4个端口发数据,结果服务器都能接收成功,客户端却只能收到第一次发送请求时那个端口来的数据,原因何在?
解决方案 »
- 在datagridview自定义的列中,如何在DataGridViewTextBoxCell中加入checkbox框
- DBlink 连接MySql数据库(事例)! nHibernate 连接MySql事例!
- webservice 与数据库分离
- 请大侠们帮帮们!!读取数据库图片后,对图像进行显示特效!
- GridView中的ItemCommand 在哪?
- history.back()最大次数问题 ie6.0
- 请问如何用WM_COPYDATA消息在两个进程间传递结构体数据
- 关于企业逻辑组件间的交互问题,设计经验丰富的大虾请进。。。
- 在PowerDesigner中怎么将name导到sqlserver中?或者可以编程的方式得到?
- dataset 和水晶报表的问题
- C# 多线程问题
- 我想每一分钟做一些事但是又不用timer控件如何作?
我的代码是C++,实现方式是,在服务器任意一个监听中保存客户端的SOCKADDR_IN后,客户端向服务器各个端口放数据,服务器收到以后马上回复。在本地测试正常,放服务器就出问题。
SOCKADDR_IN userAddr;
SOCKADDR_IN si;
si.sin_family = AF_INET;
si.sin_addr.S_un.S_addr = INADDR_ANY;//创建线程
for(int i=0; i < THREAD_NUM; ++i)
{
si.sin_port = htons(6000 + i);
sock[i] = socket(AF_INET,SOCK_DGRAM,0);
if(bind(sock[i], (sockaddr*)&g_si, sizeof(g_si)) == SOCKET_ERROR)
{
MessageBox(_T("绑定失败!"));
return;
}
HANDLE hThreadHandle = CreateThread(NULL, 0, ServerThread, (LPVOID)i, 0, 0);
if (hThreadHandle == NULL)
{
MessageBox(_T("创建线程失败!"));
return;
}
CloseHandle(hThreadHandle);}//监听
DWORD WINAPI CUdpGameServerDlg::ServerThread (LPVOID lpParam)
{
DWORD dwTrans;
DWORD nFlags = 0;
int nLen = sizeof(SOCKADDR); SOCKADDR_IN addrClient;
char tem[BUFFER_SIZE]; WSABUF buf;
buf.buf = tem;
buf.len = BUFFER_SIZE;
int ThreadID = (int)lpParam; while(TRUE)
{
WSARecvFrom(sock[ThreadID], &buf, 1, &dwTrans, &nFlags, (sockaddr*)&addrClient, &nLen, NULL, NULL); switc(dwTrans)
{
case packLen:
{
WSASendTo(sock[ThreadID], &buf, 1, &dwTrans, nFlags, (sockaddr*)&userAddr,nLen, NULL, NULL);
break;
}
case loginLen:
{
userAddr = addrClient;
break;
}
defalut:break;
}
}