轉(zhuǎn)自他人
1. UDP Socket編程
先講一講UDP
編程蚤霞,因為比TCP
要簡單多了。首先洒擦,我們需要明白UDP
是用戶數(shù)據(jù)報協(xié)議亚隅,英文名為User Datagram Protocol,它是面向無連接的倍奢。
注意:Socket
通信一定有要服務(wù)端和客戶端朴上。
1.1 UDP Socket客戶端
客戶端的工作流程:首先調(diào)用socket
函數(shù)創(chuàng)建一個Socket
,然后指定服務(wù)端的IP
地址和端口號卒煞,就可以調(diào)用sendto
將字符串傳送給服務(wù)器端痪宰,并可以調(diào)用recvfrom
接收服務(wù)器端返回的字符串,最后關(guān)閉該socket畔裕。
第一步:創(chuàng)建socket并配置socket衣撬,如服務(wù)端ip地址和端口號
第二步:調(diào)用sendto發(fā)送消息到服務(wù)器端
第三步:調(diào)用recvfrom接收來自服務(wù)器端的消息
第四步:調(diào)用close關(guān)閉socket
1.1.1 客戶端的代碼實現(xiàn):
- (void)udpClient {
int clientSocketId;
ssize_t len;
socklen_t addrlen;
struct sockaddr_in client_sockaddr;
char buffer[256] = "Hello, server, how are you?";
// 第一步:創(chuàng)建Socket
clientSocketId = socket(AF_INET, SOCK_DGRAM, 0);
if(clientSocketId < 0) {
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(1024);
int count = 10;
do {
bzero(buffer, sizeof(buffer));
sprintf(buffer, "%s", "Hello, server, how are you?");
// 第二步:發(fā)送消息到服務(wù)端
// 注意:UDP是面向無連接的,因此不用調(diào)用connect()
// 將字符串傳送給server端
len = sendto(clientSocketId, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_sockaddr, addrlen);
if (len > 0) {
NSLog(@"發(fā)送成功");
} else {
NSLog(@"發(fā)送失敗");
}
// 第三步:接收來自服務(wù)端返回的消息
// 接收server端返回的字符串
bzero(buffer, sizeof(buffer));
len = recvfrom(clientSocketId, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_sockaddr, &addrlen);
NSLog(@"receive message from server: %s", buffer);
count--;
} while (count >= 0);
// 第四步:關(guān)閉socket
// 由于是面向無連接的柴钻,消息發(fā)出處就可以了淮韭,不用管它收不收得到,發(fā)完就可以關(guān)閉了
close(clientSocketId);
}
1.1.2 客戶端的打印日志
2015-12-06 15:38:36.095 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.286 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.286 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.291 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.291 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.296 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.296 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.316 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.317 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.324 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.324 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.328 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.329 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.339 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.339 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.355 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.356 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.366 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.366 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.372 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
2015-12-06 15:38:36.373 iOS-Socket-C-Version-Client[9709:4234848] 發(fā)送成功
2015-12-06 15:38:36.392 iOS-Socket-C-Version-Client[9709:4234848] receive message from server: Hello, server, how are you?
1.2 UDP Socket服務(wù)器端
服務(wù)器端的工作流程:首先調(diào)用socket
函數(shù)創(chuàng)建一個套接字贴届,然后調(diào)用bind
函數(shù)將其與本機地址以及一個本地端口號綁定靠粪,接收到一個客戶端時,服務(wù)器顯示該客戶端的IP地址毫蚓,并將字串返回給客戶端占键。
筆者這里分成了五步:
第一步:創(chuàng)建socket
并配置socket
第二步:調(diào)用bind
綁定服務(wù)器本機ip及端口號
第三步:調(diào)用recvfrom
接收來自客戶端的消息
第四步:調(diào)用sendto
將接收到服務(wù)器端的信息返回給客戶端
第四步:調(diào)用close
關(guān)閉socket
1.2.1 服務(wù)器端代碼實現(xiàn)
- (void)udpServer {
int serverSockerId = -1;
ssize_t len = -1;
socklen_t addrlen;
char buff[1024];
struct sockaddr_in ser_addr;
// 第一步:創(chuàng)建socket
// 注意,第二個參數(shù)是SOCK_DGRAM元潘,因為udp是數(shù)據(jù)報格式的
serverSockerId = socket(AF_INET, SOCK_DGRAM, 0);
if(serverSockerId < 0) {
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(1024);
// 第二步:綁定端口號
if(bind(serverSockerId, (struct sockaddr *)&ser_addr, addrlen) < 0) {
NSLog(@"server connect socket fail");
return;
}
do {
bzero(buff, sizeof(buff));
// 第三步:接收客戶端的消息
len = recvfrom(serverSockerId, buff, sizeof(buff), 0, (struct sockaddr *)&ser_addr, &addrlen);
// 顯示client端的網(wǎng)絡(luò)地址
NSLog(@"receive from %s\n", inet_ntoa(ser_addr.sin_addr));
// 顯示客戶端發(fā)來的字符串
NSLog(@"recevce:%s", buff);
// 第四步:將接收到的客戶端發(fā)來的消息畔乙,發(fā)回客戶端
// 將字串返回給client端
sendto(serverSockerId, buff, len, 0, (struct sockaddr *)&ser_addr, addrlen);
} while (strcmp(buff, "exit") != 0);
// 第五步:關(guān)閉socket
close(serverSockerId);
}
1.2.2 服務(wù)器端的打印日志
2015-12-06 15:38:36.268 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.269 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.372 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.372 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.377 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.377 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.382 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.382 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.405 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.405 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.409 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.410 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.414 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.415 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.425 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.426 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.441 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.441 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.452 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.452 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
2015-12-06 15:38:36.472 iOS-Socket-C-Version-Server[39130:2473780] receive from 192.168.1.100
2015-12-06 15:38:36.473 iOS-Socket-C-Version-Server[39130:2473780] recevce:Hello, server, how are you?
我們這里打印出了客戶端發(fā)來的消息,由于上面實現(xiàn)的代碼中翩概,只發(fā)10次牲距,所以這里只有10條返咱。
源代碼小伙伴們,可以到github下載了:https://github.com/CoderJackyHuang/iOS-Socket-C-Version
注意:這里面有兩個工程牍鞠,一個是客戶端咖摹,一個是服務(wù)器端。運行時难述,先運行服務(wù)器端萤晴,然后再選擇客戶端。另外胁后,客戶端所指定的服務(wù)器端的ip地址一定要修改成您本機對應(yīng)的ip店读,不然使用筆者這里的ip就會失敗。