您的位置:程序门 -> vc/mfc -> 网络编程



udp socket绑定的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


udp socket绑定的问题
发表于:2007-01-17 22:22:01 楼主
想问一下下面几个问题

成功创建一个udp   socket,成功绑定一个端口,如6543,然后调用recvfrom函数

问题
1,程序a如果用这个soket向程序b发送信息,调用sendto,会用什么端口发送?会是6543?还是不确定的?
2,程序b接收到程序a发送来的消息后,进一步解析a的socket地址,然后向这个地址发送一条消息,程序a是否能接收到?

我的实验结果是
问题1中发送的端口不会是6543,而是用一个没有被使用的端口进行发送
问题2中程序a还是能接收到程序b发送的消息,但是如果程序a继续向程序b发送消息,此时a发送时采用的端口会更换

我想弄明白的是一般像qq这样的聊天程序,这个端口绑定会是怎么处理的?
还有是udp的端口绑定会有一个什么样的作用?像上面那个例子中是否只需要一端进行绑定就足够了?

表述的不是很清楚,谢谢大家解答
发表于:2007-01-18 17:27:551楼 得分:0
mark
发表于:2007-01-18 17:37:032楼 得分:0
#include   <winsock2.h>
#include   "windows.h "
#pragma   comment(lib,   "ws2_32 ")
struct   linksockcli
{
//sockaddr_in   addrfrom;
        char   ip[16];                             //ip地址。
unsigned   short   int   port;     //远程主机端口
unsigned   long   int   sendsize;   //已发送字节数
unsigned   long   int   recvsize;   //已接收字节数
unsigned   short   int   tcporudp;   //通信方式
};
socket   sockclient;//

bool   iintsock(int   verh=2,int   verl=2);   //加载winsock32   2.2版
int   bindsocket(unsigned   short   int   port);       //绑定端口
int   sendsrv(
/*socket   sockclient,*/  
dword   ipaddress,//ip1
char   *ipaddress2,//ip2默认
unsigned   short   int   port,   //端口
char   *buf,//字符串
int   len,   //长度
int   falg=2   //先择ip
);
dword   winapi   recvproc(lpvoid   lpparameter);     //接收数据
void   sockcl()
{
closesocket(sockclient);
wsacleanup();
}


int   winapi   winmain(   hinstance   hinstance,   hinstance   hprevinstance,   lpstr   lpcmdline,   int   ncmdshow)
{
        if(iintsock()==false)
{
if(iintsock(1,1)==false)
return   0;
}
int   port=5257;
while(bindsocket(port)!=1&&port <65535)  
{
port++;
}
handle   hthread=createthread(null,0,recvproc,null,0,null);
::waitformultipleobjects(1,&hthread,true,infinite);


//////////////////////////////////////////////////////////////////////////////////////////////////
return   0;
}
bool   iintsock(int   verh,int   verl)  
{
word   wversionrequested;
wsadata   wsadata;
int   err;
wversionrequested   =   makeword(   verh,verl   );
err   =   wsastartup(   wversionrequested,   &wsadata   );
if   (   err   !=   0   )   {
return   false;
}
if   (   lobyte(   wsadata.wversion   )   !=verh   ¦ ¦
                hibyte(   wsadata.wversion   )   !=   verl)   {
wsacleanup(   );
return   false;  
}
      return   true;
}
int   bindsocket(unsigned   short   int   port)
{
sockclient=socket(af_inet,sock_dgram,0);
if(invalid_socket==sockclient)
{
return   -1;
}
sockaddr_in   addrsock;
addrsock.sin_family=af_inet;
addrsock.sin_port=htons(port);
addrsock.sin_addr.s_un.s_addr=htonl(inaddr_any);

int   retval;
retval=bind(sockclient,(sockaddr*)&addrsock,sizeof(sockaddr));
if(socket_error==retval)
{
closesocket(sockclient);
return   0;
}
return   1;

}
int   sendsrv(/*socket   sockclient,*/dword   ipaddress,char   *ipaddress2,unsigned   short   int   port,char   *buf,int   len,int   falg)
{
sockaddr_in   addrsrv;
addrsrv.sin_family=af_inet;
if(falg==2)
{
addrsrv.sin_addr.s_un.s_addr=inet_addr(ipaddress2);    
}
else
{addrsrv.sin_addr.s_un.s_addr=htonl(ipaddress);
}
addrsrv.sin_port=htons(port);                                  
return   (sendto(sockclient,buf,(int)(len+1),0,(sockaddr*)&addrsrv,sizeof(sockaddr)));

}
dword   winapi   recvproc(lpvoid   lpparameter)
{

sockaddr_in   addrfrom;
int   len=sizeof(sockaddr);

char   recvbuf[1024];
int   retval;
while(true)
{
retval=recvfrom(sockclient,recvbuf,1024,0,(sockaddr*)&addrfrom,&len);
if(socket_error==retval)
break;

}
return   0;
}
发表于:2007-01-25 14:10:433楼 得分:0
本人刚写了一个基于udp点对点通讯工具,视频/语音/文件传输都用一个端口5188。加入群:4873321

飘流瓶是一个无人管理,无服务器的点对点通讯工具。

它采取udp高速发送,接收后校验的方式,所以数据传输的速度极快。

它集qq、点点通,视频电话的优点为一身,很适合喜欢看电影,网络聊天的朋友。

参与的人越多可用的资源(影音、软件)越多

操作:点“登陆”,指定一个文件即可使用


传授:视频,语音,嗅探等vc编程.qq:415159914.

飘流瓶作为例子,包含以下内容:

1.不规则窗体的创建.
2.自定义窗体类.
3.视频的捕获
4.mpeg4视频压缩解码
5.语音压缩解码.
6.彩色进度条
7.udp大文件传输
8.内网穿透技术(nat)

嗅探编程:

1.数据包捕获
2.数据包格式分析.
3.winpcap完全学习.
4.数据包的构建
5.arp,tcp,udp,hdcp等网络协议全了解.


快速检索

最新资讯
热门点击