iOS Socket编程-C语言版(UDP)
. UDP Socket编程 先讲一讲UDP编程,因为比TCP要简单多了。首先,我们需要明白UDP是用户数据报协议,英文名为User Datagram Protocol,它是面向无连接的。 注意:Socket通信一定有要服务端和客户端。
1.1 UDP Socket客户端 客户端的工作流程:首先调用socket函数创建一个Socket,然后指定服务端的IP地址和端口号,就可以调用sendto将字符串传送给服务器端,并可以调用recvfrom接收服务器端返回的字符串,最后关闭该socket。 笔者这里分成了四步: 第一步:创建socket并配置socket,如服务端ip地址和端口号
第二步:调用sendto发送消息到服务器端
第三步:调用recvfrom接收来自服务器端的消息
第四步:调用close关闭socket 1.1. 客户端的代码实现: - (void)udpClient {
int clientSocketId;
ssize_t len;
socklen_t addrlen;
struct sockaddr_in client_sockaddr;
char buffer[] = "Hello, server, how are you?"; // 第一步:创建Socket
clientSocketId = socket(AF_INET, SOCK_DGRAM, );
if(clientSocketId < ) {
NSLog(@"creat client socket fail\n");
return;
} addrlen = sizeof(struct sockaddr_in);
bzero(&client_sockaddr, addrlen);
client_sockaddr.sin_family = AF_INET;
client_sockaddr.sin_addr.s_addr = inet_addr("192.168.1.107");
client_sockaddr.sin_port = htons(); int count = ;
do {
bzero(buffer, sizeof(buffer));
sprintf(buffer, "%s", "Hello, server, how are you?"); // 第二步:发送消息到服务端
// 注意:UDP是面向无连接的,因此不用调用connect()
// 将字符串传送给server端
len = sendto(clientSocketId, buffer, sizeof(buffer), , (struct sockaddr *)&client_sockaddr, addrlen); if (len > ) {
NSLog(@"发送成功");
} else {
NSLog(@"发送失败");
} // 第三步:接收来自服务端返回的消息
// 接收server端返回的字符串
bzero(buffer, sizeof(buffer));
len = recvfrom(clientSocketId, buffer, sizeof(buffer), , (struct sockaddr *)&client_sockaddr, &addrlen);
NSLog(@"receive message from server: %s", buffer); count--;
} while (count >= ); // 第四步:关闭socket
// 由于是面向无连接的,消息发出处就可以了,不用管它收不收得到,发完就可以关闭了
close(clientSocketId);
} 1.1. 客户端的打印日志 -- ::36.095 iOS-Socket-C-Version-Client[:] 发送成功
-- ::36.286 iOS-Socket-C-Version-Client[:] receive message from server: Hello, server, how are you?
-- ::36.286 iOS-Socket-C-Version-Client[:] 发送成功
-- ::36.291 iOS-Socket-C-Version-Client[:] receive message from server: Hello, server, how are you?
-- ::36.291 iOS-Socket-C-Version-Client[:] 发送成功
-- ::36.296 iOS-Socket-C-Version-Client[:] receive message from server: Hello, server, how are you?
-- ::36.296 iOS-Socket-C-Version-Client[:] 发送成功
-- ::36.316 iOS-Socket-C-Version-Client[:] receive message from server: Hello, server, how are you?
-- ::36.317 iOS-Socket-C-Version-Client[:] 发送成功
-- ::36.324 iOS-Socket-C-Version-Client[:] receive message from server: Hello, server, how are you?
-- ::36.324 iOS-Socket-C-Version-Client[:] 发送成功
-- ::36.328 iOS-Socket-C-Version-Client[:] receive message from server: Hello, server, how are you?
-- ::36.329 iOS-Socket-C-Version-Client[:] 发送成功
-- ::36.339 iOS-Socket-C-Version-Client[:] receive message from server: Hello, server, how are you?
-- ::36.339 iOS-Socket-C-Version-Client[:] 发送成功
-- ::36.355 iOS-Socket-C-Version-Client[:] receive message from server: Hello, server, how are you?
-- ::36.356 iOS-Socket-C-Version-Client[:] 发送成功
-- ::36.366 iOS-Socket-C-Version-Client[:] receive message from server: Hello, server, how are you?
-- ::36.366 iOS-Socket-C-Version-Client[:] 发送成功
-- ::36.372 iOS-Socket-C-Version-Client[:] receive message from server: Hello, server, how are you?
-- ::36.373 iOS-Socket-C-Version-Client[:] 发送成功
-- ::36.392 iOS-Socket-C-Version-Client[:] receive message from server: Hello, server, how are you? 1.2 UDP Socket服务器端 服务器端的工作流程:首先调用socket函数创建一个套接字,然后调用bind函数将其与本机地址以及一个本地端口号绑定,接收到一个客户端时,服务器显示该客户端的IP地址,并将字串返回给客户端。 笔者这里分成了五步: 第一步:创建socket并配置socket
第二步:调用bind绑定服务器本机ip及端口号
第三步:调用recvfrom接收来自客户端的消息
第四步:调用sendto将接收到服务器端的信息返回给客户端
第四步:调用close关闭socket 1.2. 服务器端代码实现 - (void)udpServer {
int serverSockerId = -;
ssize_t len = -;
socklen_t addrlen;
char buff[];
struct sockaddr_in ser_addr; // 第一步:创建socket
// 注意,第二个参数是SOCK_DGRAM,因为udp是数据报格式的
serverSockerId = socket(AF_INET, SOCK_DGRAM, ); if(serverSockerId < ) {
NSLog(@"Create server socket fail");
return;
} addrlen = sizeof(struct sockaddr_in);
bzero(&ser_addr, addrlen); ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
ser_addr.sin_port = htons(); // 第二步:绑定端口号
if(bind(serverSockerId, (struct sockaddr *)&ser_addr, addrlen) < ) {
NSLog(@"server connect socket fail");
return;
} do {
bzero(buff, sizeof(buff)); // 第三步:接收客户端的消息
len = recvfrom(serverSockerId, buff, sizeof(buff), , (struct sockaddr *)&ser_addr, &addrlen);
// 显示client端的网络地址
NSLog(@"receive from %s\n", inet_ntoa(ser_addr.sin_addr));
// 显示客户端发来的字符串
NSLog(@"recevce:%s", buff); // 第四步:将接收到的客户端发来的消息,发回客户端
// 将字串返回给client端
sendto(serverSockerId, buff, len, , (struct sockaddr *)&ser_addr, addrlen);
} while (strcmp(buff, "exit") != ); // 第五步:关闭socket
close(serverSockerId);
} 1.2. 服务器端的打印日志 -- ::36.268 iOS-Socket-C-Version-Server[:] receive from 192.168.1.100
-- ::36.269 iOS-Socket-C-Version-Server[:] recevce:Hello, server, how are you?
-- ::36.372 iOS-Socket-C-Version-Server[:] receive from 192.168.1.100
-- ::36.372 iOS-Socket-C-Version-Server[:] recevce:Hello, server, how are you?
-- ::36.377 iOS-Socket-C-Version-Server[:] receive from 192.168.1.100
-- ::36.377 iOS-Socket-C-Version-Server[:] recevce:Hello, server, how are you?
-- ::36.382 iOS-Socket-C-Version-Server[:] receive from 192.168.1.100
-- ::36.382 iOS-Socket-C-Version-Server[:] recevce:Hello, server, how are you?
-- ::36.405 iOS-Socket-C-Version-Server[:] receive from 192.168.1.100
-- ::36.405 iOS-Socket-C-Version-Server[:] recevce:Hello, server, how are you?
-- ::36.409 iOS-Socket-C-Version-Server[:] receive from 192.168.1.100
-- ::36.410 iOS-Socket-C-Version-Server[:] recevce:Hello, server, how are you?
-- ::36.414 iOS-Socket-C-Version-Server[:] receive from 192.168.1.100
-- ::36.415 iOS-Socket-C-Version-Server[:] recevce:Hello, server, how are you?
-- ::36.425 iOS-Socket-C-Version-Server[:] receive from 192.168.1.100
-- ::36.426 iOS-Socket-C-Version-Server[:] recevce:Hello, server, how are you?
-- ::36.441 iOS-Socket-C-Version-Server[:] receive from 192.168.1.100
-- ::36.441 iOS-Socket-C-Version-Server[:] recevce:Hello, server, how are you?
-- ::36.452 iOS-Socket-C-Version-Server[:] receive from 192.168.1.100
-- ::36.452 iOS-Socket-C-Version-Server[:] recevce:Hello, server, how are you?
-- ::36.472 iOS-Socket-C-Version-Server[:] receive from 192.168.1.100
-- ::36.473 iOS-Socket-C-Version-Server[:] recevce:Hello, server, how are you? 我们这里打印出了客户端发来的消息,由于上面实现的代码中,只发10次,所以这里只有10条。 参考:https://github.com/CoderJackyHuang/iOS-Socket-C-Version 注意:这里面有两个工程,一个是客户端,一个是服务器端。运行时,先运行服务器端,然后再选择客户端。另外,客户端所指定的服务器端的ip地址一定要修改成您本机对应的ip,不然使用笔者这里的ip就会失败。
iOS Socket编程-C语言版(UDP)的更多相关文章
- iOS Socket编程-C语言版(TCP)
. TCP Socket编程 TCP是面向连接的,安全可靠的传输层协议.TCP的程序基本框架设计图: TCP的程序基本框架设计图.jpg 注意:Socket通信一定有要服务端和客户端. 1.1 TCP ...
- 计算机网络(十三),Socket编程实现TCP和UDP
十三.Socket编程实现TCP和UDP 1.TCP (1)TCPServer.java类 package com.interview.javabasic.socket; import com.int ...
- 教孩子学编程 python语言版PDF高清完整版免费下载|百度云盘|Python入门
百度云盘:教孩子学编程 python语言版PDF高清完整版免费下载 提取码:mnma 内容简介 本书属于no starch的经典系列之一,英文版在美国受到读者欢迎.本书全彩印刷,寓教于乐,易于学习:读 ...
- python socket 编程(TCP与UDP)
实验环境:python2 一.TCP编程 1.建立TCP服务器 ①创建TCPServer.py文件 ②编写服务器代码 1)创建socket对象,调用socket构造函数 2)绑定ip端口(IP号和端口 ...
- Socket编程(C语言实现):socket()函数英文翻译
最近开始研究使用Socket API来网络编程,想着把自己的感想.感悟写下来.我发现在编程之外还有不少概念性的东西要学习.我觉得应该有以下几点吧: 1.得了解下计算机网络的基本概念,如OSI的7层模型 ...
- win32 socket 编程(六)——UDP
基于 UDP 无连接的 socket 编程 一.服务器端操作流程 1.1加载套接字库(WSAStartup) 1.2 创建套接字 (socket) 1.3将创建的套接字绑定到一个本地地址和端口上 ...
- iOS Socket编程(一)基本概念
1.Socket的解释 Socket翻译过来中文称为套接字, 这里我找到了一段比较官方的解释Socket是什么东西: Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行 ...
- iOS socket编程 第三方库 AsyncSocket(GCDAsyncSocket)
Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Clien ...
- python网络编程socket编程(TCP、UDP客户端服务器)
摘录 python核心编程 使用socket()模块函数创建套接字——通信端点 >>> from socket import * >>> tcpSock = soc ...
随机推荐
- 何为仿射变换(Affine Transformation)
http://www.cnblogs.com/ghj1976/p/5199086.html 变换模型是指根据待匹配图像与背景图像之间几何畸变的情况,所选择的能最佳拟合两幅图像之间变化的几何变换模型.可 ...
- MySQL从删库到跑路_高级(四)——存储过程
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.存储过程简介 1.存储过程简介 存储过程是一组具有特定功能的SQl语句集组成的可编程的函数,经编译创建并保存在数 ...
- 20155213 2016-2017-2 《Java程序设计》第九周学习总结
20155213 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 JDBC(Java DataBase Connectivity)即java数据库连 ...
- 2016-2017-2 《Java程序设计》第5周学习总结
学号 2016-2017-2 <Java程序设计>第5周学习总结 教材部分学习内容总结 第八章: 一.语法与继承架构 使用try.catch: •执行流程 1.尝试执行try区块中程序代码 ...
- HexDump.java解析,android 16进制转换
HexDump.java解析android 16进制转换 package com.android.internal.util; public class HexDump { private final ...
- 线程属性pthread_attr_t简介
本文编辑整理自: http://hi.baidu.com/7828058/blog/item/256e16decd1a385e94ee3784.html http://www.ibm.com/deve ...
- 访问Hsql .data数据库文件
一.Hsql简介: hsql数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议. 仅一个hsqldb.jar文件就包括了数据库引擎,数据库驱动,还有其他用户界面操作等内容.下载地址 ...
- oracle用户名和密码到期后如何处理
原因:确定是由于Oracle11g中默认在default概要文件中设置了“PASSWORD_LIFE_TIME=180天”所导致. 影响: 1.密码过期后,业务进程连接数据库异常,影响业务使用. 2. ...
- 阿里云实现简单的运行 Django 项目
首先申请一个阿里云账号,买一个阿里云服务器是必须的,对于一个学生来讲,按道理说,在不打折不搞活动的时候,价格还是蛮贵的,所以说,同志们,革命尚未成功,一定要挺住!!! 申请了阿里云,消费完毕,登录阿里 ...
- 函数对象与仿函数(function object and functor)
part 1. 仿函数在STL组件中的关系 如下图: # 仿函数配合算法完成不同的策略变化. # 适配器套接仿函数. part 2. 仿函数介绍 传递给算法的“函数型实参”不一定得是函数,可以是行为类 ...