一、分别用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];