http://www.c-sharpcorner.com/Network/NetworkProgramPart2RVS.asp

解决方案 »

  1.   

    //线程同步方法begReceive
    private void begReceive()
    {
    StateObject state = new StateObject();
    state.workSocket = handler;
    handler.BeginReceive(state.buffer,0,StateObject.BufferSize,0,new AsyncCallback(ReadCallback),state); //中断指定的客户端
    if(ClickBreak)
    {
    BreakClient(ref handler);
    } string strAccept = "";
    strAccept = state.sb.Append(System.Text.Encoding.UTF8.GetString(state.buffer,0,24)).ToString();
    //sw.Write(handler.RemoteEndPoint.ToString()+":");
    sw.WriteLine(strAccept);
    //MessageBox.Show(strAccept);
    txtSend.Text = strAccept;
    sw.Flush();

    }//end begReceive //异步回调方法ReadCallback
    private void ReadCallback(IAsyncResult ar)
    {
    StateObject state = (StateObject) ar.AsyncState;
    Socket tt = state.workSocket; //重新开始读取数据
    try
    {
    //结束读取并获取读取字节数
    //int bytesRead = handler.EndReceive(ar);
    int bytesRead = tt.EndReceive(ar);
    state.sb.Append(System.Text.Encoding.UTF8.GetString(state.buffer,0,bytesRead));
    string content = state.sb.ToString();
    state.sb.Remove(0,content.Length); //txtSend.Text = content;
    textBox1.AppendText(tt.RemoteEndPoint.ToString()+": "+content+"\r\n"); tt.BeginReceive(state.buffer,0,StateObject.BufferSize,0,new AsyncCallback(ReadCallback),state);
    }
    catch
    {
    //从lvIncept控件删除相应的信息
    if(ClickBreak == false)
    {
    for(int i=0;i<lvIncept.Items.Count;i++)
    {
    if(lvIncept.Items[i].SubItems[0].Text == tt.RemoteEndPoint.ToString())
    {
    lvIncept.Items[i].Remove();
    }
    }
    } intClient--;
    txtCount.Text = intClient.ToString();
    }

    }//end ReadCallback
      

  2.   

    楼上的2位的case我都实现了,现在我想实现的是:
    public struct Message
    {
         string  NickName;
         int     Number;
    }
    Message msg;
    msg.NickName = "dongdong"
    msg.Number   = 14;
    我怎么用Socket.Send(byte[])这个函数把msg发送出去?发送后另外一端怎么解析出来?
      

  3.   

    我现在也正在做有关 winsock方面的东东.我想和在delphi下差不多吧.以下是我自定义的一些协议,好像winsock 是不能帮你发送结构体,因为它是按 stream(流)的形式传送的吧.如果要的话,那只能自己定义了.
    以下是我定义的一些有关内容.这里给出的是关于用户取回密码的一些定义.其它你把结构结定义成一个有特定意义的字符串就行了,然后在取回的时候再进行那样的结合就行了.   {取回密码}
       GetRegPwd='`GPWD`';  //取回密码请请求;
      SendREgPwd='`SPWD`';  //服务器回传密码;
       NoUsrID  ='`NOID`';  //不存在的用户名;
       ErrorInfo='`EINF`';  //请求信息不正确;
       //SuccInfo ='`SINF`';  //取回密码成功;
        {取回密码结构体}
        PwdUsrID='``I``' ;  //要确认的用户名;
        PwdName ='``N``' ;  //要确认的姓名;   {返回密码时的标志}
        RetPwd  ='``RP`';   //返回用户密码  {结构体每一节的结束标志} 
         EndSymbol='|^|';    //每一节以此为结束标致