本次實現的是面向非鏈接的socket通訊方式。其流程爲:服務器
一、服務器代碼網絡
(1)代碼:socket
/** * @file: udpserver.c * @brief: A simple Udp server * @author: ToakMa <mchgloak1120@163.com> * @date: 2014/10/09 */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 9988 #define BUFF_SIZE 1024 int main(int argc, char *argv[]) { int sockfd; int sin_len; struct sockaddr_in saddr; struct sockaddr_in remote_addr; char buff[BUFF_SIZE]; int res, len; //1. create socket sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (-1 == sockfd) { perror("Udp server socket: "); return -1; } printf("Udp server socket create succ!\n"); //2. prepare IP and port memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_port = htons(PORT); saddr.sin_addr.s_addr = INADDR_ANY; bzero(saddr.sin_zero, 8); //3. bind res = bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)); if (-1 == res) { perror("udp server bind: "); return -1; } //4. recvfrom printf("Wait for a packet ...\n"); sin_len = sizeof(struct sockaddr_in); len = recvfrom(sockfd, buff, BUFF_SIZE, 0, (struct sockaddr *)&remote_addr, &sin_len); if (-1 == len) { perror("udp server recvform: "); return -1; } buff[len] = '\0'; printf("Recived packet from %s, contents is: %s \n", \ inet_ntoa(remote_addr.sin_addr), buff); //5. close close(sockfd); return 0; }
(2)程序理解:測試
程序建立了一個套接字,並綁定在UDP端口9988上。接着recvfrom()系統調用阻塞等待進入的數據包。此時的任何網絡設備均可以發送數據給本服務器的UDP9988端口,由於套接字並無鏈接到一個特定的主機。當數據到達時,服務器提示發送者的IP和內容。最後關閉套接字。this
二、客戶端程序spa
(1)代碼:.net
/** * @file: udpclient.c * @brief: A simple Udp server * @author: ToakMa <mchgloak1120@163.com> * @date: 2014/10/09 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define BUFF_SIZE 1024 #define PORT 9988 int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in remote_addr; int len; char buff[BUFF_SIZE]; //1. create a socket sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (-1 == sockfd) { perror("udp client socket: "); return -1; } //2. prepare ip and port memset(&remote_addr, 0, sizeof(remote_addr)); remote_addr.sin_family = AF_INET; remote_addr.sin_port = htons(PORT); remote_addr.sin_addr.s_addr = inet_addr(argv[1]); bzero(&(remote_addr.sin_zero), 8); //3. sendto strcpy(buff, "this a test\n"); printf("sending : %s\n", buff); len = sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&remote_addr, sizeof(remote_addr)); if (len < 0) { perror("udp client sendto :"); return -1; } //4. close close(sockfd); return 0; }
(2)程序理解:code
程序建立一個套接字,並經過sendto()系統調用發送到指定的UDP端口。orm
三、測試
server
固然,程序也能夠經過send()和recv()系統調用來實現。
寫這些沒有講解原理,由於有不少書寫的很好了,能夠去看下先關的書籍。分享,沉澱。
程序源代碼:http://www.oschina.net/code/snippet_1241861_39182