服务器端在Linux下采用单进程多端口连接的方式在用CAsyncSocket 发送数据时,比如有三条数据需要发送,command1, command2, command3, 各条数据以'\n'为分隔符在OnSend事件中调用doc的发送函数:
OnSend()
{
 socket->send() //如果没有发送完全部数据
 socket.AsyncSelect(FD_READ|FD_WRITE|FD_CLOSE)
 //否则
 socket.AsyncSelect(FD_READ|FD_CLOSE)
}这时确实是发送了三次,发送的数据也正确,但服务器端,可能受服务器端recv size影响,接受到的数据可能成了:第一次接受:command1\ncomm
第二次接受:and2\ncommand3\n因为服务器端只有一个进程,所以也不能把收到的一半命令保存起来,当然可以保存到一个动态的数组,但我不知道有没有其他好的解决办法?如果不保存,就会把第二条命令丢掉,请问有没有人知道怎莫解决这个问题?另外一个问题,Linux 下, accept后用fork()产生子进程来进行通信,我用三个客户端连接,通信正常,但服务器端的socket reference 都是同一个值:4,不知道是为什莫?难道是对每个进程而言,这个只是互相独立的吗?今天回复,今天给分,否则就过了春节了?祝大家新年快乐!

解决方案 »

  1.   

    春节愉快.
    我希望你早点解决这个问题,
    建议绕开MFC,自己直接用底层SOCKET编程.
      

  2.   

    不是自己想用MFC,而是需要自己实现的他已经给做了,不想自己在做一遍。
    如果用socket来写,要达到异步通讯的效果,肯定会用到线程,在线程中检查是否可以发送或接收数据,再发消息通知主控制程序,而这些,就是CAsyncSocket 做的,而起这个问题和用什莫作没有关系,这是在网络上发送数据都有的问题,你可以在客户端发送1000字节,如果每次服务器端只接受500,那就会收两次
      

  3.   

    你的意思就是服务端接收来自客户端不定长度的数据包的问题?
    其实你这里(客户端的)用select模型的目的只是保证了数据发送了而已(发送到传输层)。
    但你没定义发送数据的长度!那为什么你自己定义一个数据结构呢?
    例如:数据头+数据长度标识+实际数据+结束位
    如果这样做,服务端先接收(根据数据头)一定长度的数据:sizeof(数据头+数据长度)
    接着解释这个数据得到“数据长度”。接着再根据这个长度去接收剩下的数据。而且最好在select上加上超时处理,处理一旦出现异常的时候不会“死卡”着。Linux我就不知道了,你比我老。呵呵。