udp 服务端如何知道客户端socket

magic_feng 2010-03-31 07:01:21
如题:
如果是tcp,通过accept得到一个socket,然后向客户端发信息是就用这个socket,但是udp没有accept,当我要分发消息到多个客户端时要如何做?还请各位高手赐教。
还有一个问题不太明白,udp向客户端发消息是可以用自己bind的socket的,为啥?,那如果多个客户端它会发到哪里去?
附上自己写的一些代码:
UDPserver
int main()   
{
#ifdef WIN32
WSADATA wsaData;
#endif
// hostent* HostEnt;
protoent* ProtoEnt;
#ifdef WIN32
if(WSAStartup(MAKEWORD(2,2),&wsaData))
{
printf("Init WinSock failed!\n");
return 1;
}
#endif
SOCKET s = 0;
sockaddr_in sin = {0};

sin.sin_family = AF_INET;
sin.sin_port = htons(24);
sin.sin_addr.S_un.S_addr = INADDR_ANY;

s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

if (bind(s, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
{
return 0;
}

char buffer[1024] = "\0";
sockaddr_in addr = {0};
int nLen = 0;

nLen = sizeof(sockaddr_in);

while (true)
{
int nRecv = 0;
nRecv = recvfrom(s, buffer, 1024, 0, (sockaddr*)&addr, &nLen);
//printf("a");
if (nRecv > 0)
{
buffer[nRecv] = '\0';
printf("abc");
sendto(s, buffer, strlen(buffer), 0, (sockaddr*)&addr, sizeof(addr));

}
}

}


Client:
if __name__=='__main__':   
import socket
sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.connect(('localhost',24))
import time
time.sleep(2)
sock.sendall('1000000')
while True:
str=sock.recv(1024)
if str:
print str
break
print "break"
sock.close()


...全文
785 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
magic_feng 2010-04-02
  • 打赏
  • 举报
回复
呵呵,谢谢各位,已经搞明白了!
yanghehong 2010-04-02
  • 打赏
  • 举报
回复
你说的 udp服务端如何知道客户端socket,应该就是怎么知道客户端的IP地址和UDP端口。


一般来说有两种方式:

一种是客户端发消息显示显式地告诉服务器IP地址和端口,消息内容就包括IP地址和UDP端口。

另外一种就是隐式的,服务器从收到的包的头部中得到包的源IP地址和端口。


- 千里孤行
wood87654321 2010-04-02
  • 打赏
  • 举报
回复
通常udp服务端根本不需要知道客户端的socket,它直接建立一个socket用于发送即可,udp通信的关键只在于IP和端口。多个客户端如果需要点到点分发,必须给服务端socket循环设置每个客户端的IP并发出,但更常用的是广播分发,服务端socket设定一个224.X.X.X的广播地址并始终向它发送,每个客户端建立的socket只需要绑定这个广播地址便可以收到
Kudeet 2010-04-01
  • 打赏
  • 举报
回复
UDP socket是没有bind的用法的!
sock = socket(AF_INET, SOCK_DGRAM, 0);
创建sock后即可在该socket上用recvfrom/sendto方法发送接受数据了.

多客户端用UDP SOCKET发到不同的地址即可

4,361

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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