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];
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值