我做了一个这样的小程序。一个基于TCP的网络聊天程序。实现的功能是客户端输入IP和PORT连接服务器,接受,发送数据。创建一个服务端,主要是设置IP和PORT,作为一个中转站接收一个客户端的消息,然后发送给其他所有的客户端。
我主要的问题是 服务端的中转站怎么编写?
void CServerDlg::TranslateData()
{
sockaddr_in serveraddr;
char buffer[1024];
int len =sizeof(serveraddr);
//接收客户端的数据
int curlink = -1;
int num = -1;
for (int i = 0; i < MAXNUM; i++)
{
num= recv(m_Clients[i],buffer,1024,0);
if (num != -1)
{
curlink = i;
break;
}
}
buffer[num]= 0;
if (num == -1) //接受客户端的连接
{
if (m_ConnectNum < MAXNUM)
{
m_Clients[m_ConnectNum] = accept(m_SockServer,(struct sockaddr*)
&serveraddr,&len);
m_ConnectNum++;
}
return;
}
//将接收的数据发送给客户端
for (int j = 0; j < m_ConnectNum; j++)
if (j != curlink)
send(m_Clients[j],buffer,num,0);
}这样编的话  就是当有两个或以上的客户端  同时send的时候就会出错。 还有我设置的异步处理WSAAsyncSelect(m_SockServer,m_hWnd,WM_USER+1,FD_WRITE|FD_READ|FD_ACCEPT);
我在想用switch case语句的话怎么编写void CServerDlg::TranslateData()而实现服务端的中转站功能和设置客户端最多连接数?

解决方案 »

  1.   

    楼主你的思维有点混乱,建议你多看看基础的书,我先指出的不对的地方:
    void CServerDlg::TranslateData()
    {
    sockaddr_in serveraddr;
    char buffer[1024];
    int len =sizeof(serveraddr);
    //接收客户端的数据
    int curlink = -1;
    int num = -1;
    for (int i = 0; i < MAXNUM; i++)
    {
    num= recv(m_Clients[i],buffer,1024,0);//在这里,你先接收来自客户端的数据。
    if (num != -1)
    {
    curlink = i;
    break;
    }
    }
    buffer[num]= 0;
    if (num == -1) //接受客户端的连接
    {
    if (m_ConnectNum < MAXNUM)
    {
    m_Clients[m_ConnectNum] = accept(m_SockServer,(struct sockaddr*) //然后再接收来自客户端的连接
    &serveraddr,&len);
    m_ConnectNum++;

    return;
    }正常的顺序应该是先接收来自客户端的连接,然后才能接收收发送数据。
    一般来聊天转发服务器程序,至少需要二个线程来完程(当然,也可以利用WINDOWS的WSAAsyncSelect),一个线程专门用来接收来自客户的连接,另一个处理客户端的数据并处理。
      

  2.   

    我以前用JAVA写过,服务器主要维护着一个客户端的列表,每一个客户端连接之后都会生成一个线程去监听
    在客户端和服务器之间的通信格式上也应该有着明确的规定,这样服务器可以检查每个来的数据包,从中找出接收者,然后从客户端列表中去查找,转发到相应的客户端上去,大体上是这样的