前段时间发了个TCP通信的例子,现在再来一个UDP通信的例子。这些可以作为样本程序,用到开发中。“裸写”socket老是记不住步骤,经常被鄙视……
下面的例子很简单,写一个UDP的server用于收包,写一个UDP的client用于发包并接收来自server的回复。其中UDP的client写了两个,一个是不需要connect的,另一个是带上connect的,两个client实现的功能是一样的。从效率上,带上connect的UDP肯定效率稍微高一些。不过UDP的connect和TCP里面非常不一样。在UDP里面connect的时候并没有三次握手的过程,但是它指定了与自己通信的对方的具体地址,内核中会将次地址记录下来,如果你的UDP就是在确定了两台机器之间传送信息,建议选取带有connect的套接字。connect之后与对方通信直接write或者read函数就可以,不用再指定对方ip和port,并且connect之后的套接字可以自动过滤掉不是来自指定通信方的信息。UDP可以调用多次connect函数,但是TCP套接字只能调用一次,再次调用会出现错误。
1. 首先是服务端的程序:
UDPserver.cpp
1 #include <stdio.h> 2 #include <string.h> 3 #include <unistd.h> 4 #include <sys/types.h> 5 #include <sys/socket.h> 6 #include <stdlib.h> 7 #include <netinet/in.h> 8 #include <arpa/inet.h> 9 10 #define PORT 1234 11 #define MAXDATASIZE 100 12 13 int main(void) 14 { 15 int sockfd; 16 struct sockaddr_in server; 17 struct sockaddr_in client; 18 socklen_t len; 19 int num; 20 char buf[MAXDATASIZE]; 21 if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 22 { 23 perror("Creating socket failed. "); 24 exit(1); 25 } 26 bzero(&server, sizeof(server)); 27 server.sin_family = AF_INET; 28 server.sin_port = htons(PORT); 29 server.sin_addr.s_addr = htonl(INADDR_ANY); 30 if(bind(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1) 31 { 32 perror("Bind() error. "); 33 exit(1); 34 } 35 36 len = sizeof(client); 37 while(1) 38 { 39 num = recvfrom(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&client, &len); 40 if(num < 0) 41 { 42 perror("recvfrom() error. "); 43 exit(1); 44 } 45 buf[num] = '