专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 网络通信

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

发布时间:2011-07-03 07:12:58 文章来源:www.iduyao.cn 采编人员:星星草
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只需要绑定这个广播地址便可以收到
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: