最终的目的期望--------------------------------------
预设条件:Server用SOCK_RAW类型创建Socket;
预期效果:Server收到Client的消息后,反馈回Client;Client收到反馈回的消息再发给Server,如此循环。Server的实现流程-------------------------------------
创建如下的socket
sListen = socket(AF_INET, SOCK_DGRAM/*SOCK_RAW*/, IPPROTO_UDP);
然后bind,接着再循环中进行recvfrom,一旦收到Client的数据后
解析IP头和UDP头,然后将IP和Port源端和目的端对换。
接着将该数据再sendto回Client,其中sockaddr_in参数延用recvfrom时的sockaddr_inClient的实现流程-------------------------------------
SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
然后在循环中向服务器sendto数据;
接着recvfrom接收从server返回的消息。问题是这样的:
按照上述做,Server收到Client的消息后,再反馈回Client,能够发送出去且无Error,但是Client收不到消息。
如果在Server创建socket时如果用SOCK_DGRAM做参数,且注掉IPHeader的解析,则可以达到预期的效果。
PS:发现SOCK_RAW时,Server在Recvfrom时的addr_in结构里的port始终是0,SOCK_DGRAM则正常。
请问如何用SOCK_RAW达到预期的效果?

解决方案 »

  1.   

    按照上述做,Server收到Client的消息后,再反馈回Client,能够发送出去且无Error,但是Client收不到消息。=========
    说明你的IP头构造的不对.不是简单将源IP,Port和目的端口交换就了事,还要算包头里的和校验码.
      

  2.   

    而且SOCK_RAW和平台有关,win2k和XP SP2是可以的.有些平台和补丁包下有限制。