先看下面的一段代码
#include "stdafx.h"
#include <stdlib.h>
#include <Winsock2.h>
#pragma  comment(lib,"Ws2_32.lib")int main(int argc, char* argv[])
{
WSADATA wd;
WSAStartup(0x0101,&wd);
SOCKET s;
s=socket(AF_INET,SOCK_DGRAM,0);
sockaddr_in si;
memset(&si,0,sizeof(si));
si.sin_addr.S_un.S_addr=INADDR_ANY;
si.sin_family=AF_INET;
si.sin_port=htons(atol(argv[1]));
    if(bind(s,(sockaddr*)&si,sizeof(si))==SOCKET_ERROR)
{
printf("bind error:%d",WSAGetLastError());
return 0;
}
SOCKET s0;
s0=socket(AF_INET,SOCK_DGRAM,0); char c[1000];
sockaddr_in csi;
int len;
while(1)
{
len=sizeof(csi);
if(recvfrom(s,c,1000,0,(sockaddr*)&csi,&len)!=SOCKET_ERROR)
{
printf("received: ip:%s,port:%d\n",inet_ntoa(csi.sin_addr),ntohs(csi.sin_port));
if(sendto(s0,c,1000,0,(sockaddr*)&csi,sizeof(csi))==SOCKET_ERROR)
{
printf("sendto error:%d",WSAGetLastError());
return 0;
}
}
else
{
printf("recv error:%d",WSAGetLastError());
return 0;
}
Sleep(500);
}
return 0;
}
我在公网上运行上面的程序,然后写一个相应的UDP客户端向服务器发包和收包,客户端没有公网IP,通过一个网关连接到INTERNET.但是服务器可以收到客户端发来的包,但服务器向客户端发包的时候客户端却收不到,如果把上面的sendto()函数的第一个参数换成s,则客户端就可以收到服务器发出的包,请高手指点是什么原因,如何解决,谢谢!

解决方案 »

  1.   

    udp用一个端口就既可以发送也可以接收了阿,没有必要用2个。
      

  2.   

    对方在网关后面,只能用它给你连接的UDP通道进行通信,你不可能主动访问到网关后面的主机的。
      

  3.   

    to Kevin_qing()
    是的,但是如果有必要用两个呢?to bjay
    那QQ如何搞的?你的"主动"只能理解成通讯的发起端总是网关后的机器而不是不可能主动访问到网关后面的主机.
      

  4.   

    先用
    setsockopt(s0,SOL_SOCKET,SO_RCVBUF|SO_REUSEADDR,(char FAR*)sockBufferR,dwDataSize);
    然后bind s0
      

  5.   

    写错了,要发送的话:
    是setsockopt(s0,SOL_SOCKET,SO_SNDBUF|SO_REUSEADDR,(char*)sockBufferS,dwDataSize)
    sockBufferS :发送缓冲区首址
    dwDataSize : 缓冲区大小
      

  6.   

    to jadetiger(白玉老虎) 
    不过你“连接”多少客户端,使用udp通讯的话一个端口足够了。
    不过如果你非要使用2个地话,在局域网内一定要使用两个端口都忘外发送数据,对方才可以和这两个端口通讯。具体的和网关的NAT设置有关
      

  7.   

    to ysf1980
    你还没有解决我想想解决的问题,你的方法是可以,但其实还是用的同一个套接字的.试想下面的情形,有第三台机器想向网关后的机器发包怎么办,我们把服务器得到时的IP和端口告诉第三台机器.虽然知道了IP和端口发包却收不到.to kevin_qing()
    请你讲具体一点.我主要想解决的问题就是有一个服务器,其他机器都在网关内部,然后所有客户都连上服务器,服务记下了每个客户的IP和端口并发给每个客户端,客户端可不可以用这些IP和端口和直接和其他客户端通信?
      

  8.   

    Socket通信是Client/Server模式,服务端必须绑定
    你新建了套接字,但没有绑定,那就相当于是两个
    客户端,当然不能通信了