如题:
如果是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只需要绑定这个广播地址便可以收到