首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络协议 >

udp 服务端怎么知道客户端socket

2012-02-12 
udp 服务端如何知道客户端socket如题:如果是tcp,通过accept得到一个socket,然后向客户端发信息是就用这个s

udp 服务端如何知道客户端socket
如题:
  如果是tcp,通过accept得到一个socket,然后向客户端发信息是就用这个socket,但是udp没有accept,当我要分发消息到多个客户端时要如何做?还请各位高手赐教。
  还有一个问题不太明白,udp向客户端发消息是可以用自己bind的socket的,为啥?,那如果多个客户端它会发到哪里去?
  附上自己写的一些代码:
UDPserver

C/C++ code
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:
Python code
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() 


 

[解决办法]
UDP socket是没有bind的用法的!
sock = socket(AF_INET, SOCK_DGRAM, 0);
创建sock后即可在该socket上用recvfrom/sendto方法发送接受数据了.

多客户端用UDP SOCKET发到不同的地址即可
[解决办法]
你说的 udp服务端如何知道客户端socket,应该就是怎么知道客户端的IP地址和UDP端口。


一般来说有两种方式:

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

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


- 千里孤行
[解决办法]
通常udp服务端根本不需要知道客户端的socket,它直接建立一个socket用于发送即可,udp通信的关键只在于IP和端口。多个客户端如果需要点到点分发,必须给服务端socket循环设置每个客户端的IP并发出,但更常用的是广播分发,服务端socket设定一个224.X.X.X的广播地址并始终向它发送,每个客户端建立的socket只需要绑定这个广播地址便可以收到

热点排行