本文主要是介绍iOS 网络相关面试题(一个基于UDP的简单的聊天Demo),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、分别用C语言、python、GCDAsyncUdpSocket来实现UDP通信
1、C语言方式
- 首先初始化
socket
对象,Udp要用SOCK_DGRAM
- 然后初始化
sockaddr_in
网络通信对象,如果作为服务端要绑定socket
对象与通信链接,来接收消息 - 然后开启一个循环,循环调用
recvfrom
来接收消息 - 收到消息后,保存下发消息对象的地址,以便之后回复消息
- (void)initCSocket
{char receiveBuffer[1024];__uint32_t nSize = sizeof(struct sockaddr);if ((_listenfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){perror("socket() error. Failed to initiate a socket");}bzero(&_addr, sizeof(_addr));_addr.sin_family = AF_INET;_addr.sin_port = htons(_destPort);if(bind(_listenfd, (struct sockaddr *)&_addr, sizeof(_addr)) == -1){perror("Bind() error.");}_addr.sin_addr.s_addr = inet_addr([_destHost UTF8String]);//ip可是是本服务器的ip,也可以用宏INADDR_ANY代替,代表0.0.0.0,表明所有地址while(true){long strLen = recvfrom(_listenfd, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *)&_addr, &nSize);NSString * message = [[NSString alloc] initWithBytes:receiveBuffer length:strLen encoding:NSUTF8StringEncoding];_destPort = ntohs(_addr.sin_port);_destHost = [[NSString alloc] initWithUTF8String:inet_ntoa(_addr.sin_addr)];NSLog(@"来自%@---%zd:%@",_destHost,_destPort,message);}
}
- 由于开启while循环来一直接收消息,所以为了避免阻塞主线程,这里要将
initCSocket
函数放在子线程中调用
dispatch_async(dispatch_get_global_queue(0, 0), ^{[self initCSocket];
这篇关于iOS 网络相关面试题(一个基于UDP的简单的聊天Demo)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!