问题源于以前未结的帖子http://topic.csdn.net/u/20120801/16/703112aa-9296-4cc1-b888-473ffc2fd758.html?seed=670887654&r=79290315#r_79290315
假设2台主机A、B都向一台主机C发送图片数据,我的异步方式处理接收方案:如果我的想法是对的,我就继续往下进行,如果有问题,大家帮忙看看或者给些建议。
采用UDP协议,WInsocket通信。
设:
A主机IP地址为IPA套接字绑定端口1025------------>C主机IP地址为IPC套接字A绑定端口5001
B主机IP地址为IPB套接字绑定端口1025------------>C主机IP地址为IPC套接字B绑定端口5002C主机程序中,声明两个套接字变量用于接收,问题是:
我在主线程中声明两个套接字变量,然后在OnInitDialog()中分别初始化和绑定(用WInsocket API),并设置异步通信方式WSAAsyncSelect(m_SocketA,m_hWnd,CM_RECEIVEDA,FD_READ),
WSAAsyncSelect(m_SocketB,m_hWnd,CM_RECEIVEDB,FD_READ),问:
1、我这样做对不对。
2、如果对,要实现多线程接收该是什么思路,与上述方案有什么区别。

解决方案 »

  1.   

    1、建议初始化socket在app的initial中做。2、如果数据量很大的话,不建议这么做,还是开两个线程,在线程循环recvfrom
      

  2.   

    to:dickbarry(小怪龙)
    谢谢,上次多谢帮忙啊。
    还是开两个线程,在线程循环recvfrom?不明白思路,希望都费点笔墨,给些指导性思路
      

  3.   


    上次...没看到是你哈...因为考虑到你图片传输可能数据量比较大,单线程消息的话,有可能来不及处理。你可以做个测试,看是否能够及时处理
    在多线程,开socket,然后在端口上recvfrom,收到后处理。多个线程处理起来充分利用CPU,就两个机器的话,两个线程足矣...建议不要将所有的工作都在UI线程上做,比较混乱...
      

  4.   

    to:dickbarry(小怪龙)
    可能你忘了,就是这个http://topic.csdn.net/u/20120824/08/1f839511-41b4-4d5c-b36a-fd3cb3ebfa9c.html?18277
    关于你的意见,我有如下思路,是否是你说的:
    C主机程序中,创建两个线程(CWinThread类派生)用于接收,问题是:
    我在主线程中声明两个套接字变量,然后分别在两个线程的InitInstance中初始化和绑定(用WInsocket API),并分别设置异步通信方式WSAAsyncSelect(m_SocketA,????,CM_RECEIVEDA,FD_READ),
    WSAAsyncSelect(m_SocketB,????,CM_RECEIVEDB,FD_READ),问:
    1、我这样在线程的InitInstance中初始化、绑定、设置异步对不对,如果对,参数????如何设置。
    2、我在子线程中添加CM_RECEIVED消息的响应函数,在子线程中该函数能被触发吗?即能接收到数据吗?
    3、同样,如果我能在该消息的响应函数中收到数据,sendto函数能将数据发到指定的IP端口吗?
    4、有更好的方案吗
      

  5.   

    1、socket初始化一次就可以了
    2、多线程阻塞模式,就不再需要消息了
    3、如果按照你的方案,可以的
    4、对于客户端较少,传输量大,连接少,多线程阻塞模式工作就很好
      

  6.   

    谢谢dickbarry(小怪龙)
    采用UDP协议
    对于方案1,主线程中两个套接字分别异步接收
    方案2,主线程中开两个子线程,每个线程一个套接字异步接收
    二者都是异步方式(即非阻塞模式),那么有何区别?
    如果有方案3,主线程一个套接字,异步接收,根据接收数据的IP地址不同而做不同处理。
    这个方案与前两个有何不同?
    个人感觉对于UDP异步接收,多线程接收好像没意义。用方案3就行。前两个好像多此一举似的。
    对于阻塞模式,多线程是解决阻塞的。对于异步接收,多线程接收就没什么意义,而应该将多个线程用来处理接收的数据上以提高效率。上诉理解不知对否?
      

  7.   

    WSAAsyncSelect一般是单线程使用的模式,多线程模式就是简单的处理,如果连接不多可以使用,具体来说就是一个线程干一种活,例如recvfrom一个端口就在一个线程中循环处理,不需要使用阻塞模式,但如果预计到连接数会超出CPU内核个数的两倍时这种多线程方式的响应会严重 滞后,但这种多线程编程方法简单很好处理是他的优势