UDP套接字SOCKET通信问题!
UDP服务端创建了四个套接字,端口为6000-6003 绑定好后,客户端向服务器其中一个端口发送请求。服务器收到以后保存客户端的SOCKADDR_IN地址。然后客户端分别向服务器4个端口发数据,结果服务器都能接收成功,客户端却只能收到第一次发送请求时那个端口来的数据,原因何在? --------------------编程问答-------------------- 自己顶上!!! --------------------编程问答-------------------- 这叫什么问题?看不懂的路过。 --------------------编程问答-------------------- 发代码来看看? --------------------编程问答-------------------- 你加了循环“侦听”了么? --------------------编程问答--------------------
加了,本地测试正常,放服务器出现这种问题。 --------------------编程问答--------------------
我的代码是C++,实现方式是,在服务器任意一个监听中保存客户端的SOCKADDR_IN后,客户端向服务器各个端口放数据,服务器收到以后马上回复。在本地测试正常,放服务器就出问题。 --------------------编程问答-------------------- SOCKET sock[4];
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;
}
de易做图t:break;
}
}
补充:.NET技术 , C#