UDP socket绑定的问题

jackion31 2007-01-17 10: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的端口绑定会有一个什么样的作用?像上面那个例子中是否只需要一端进行绑定就足够了?

表述的不是很清楚,谢谢大家解答
...全文
339 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dodo888 2007-01-25
  • 打赏
  • 举报
回复
本人刚写了一个基于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等网络协议全了解.
macnab 2007-01-18
  • 打赏
  • 举报
回复
#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;
}
yanzepeng 2007-01-18
  • 打赏
  • 举报
回复
Mark

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧