C 代码,可以用于OSX运行
/* Client-server example using UDP[edit] The User Datagram Protocol (UDP) is a connectionless protocol with no guarantee of delivery. UDP packets may arrive out of order, multiple times, or not at all. Because of this minimal design, UDP has considerably less overhead than TCP. Being connectionless means that there is no concept of a stream or permanent connection between two hosts. Such data are referred to as datagrams (Datagram Sockets). UDP address space, the space of UDP port numbers (in ISO terminology, the TSAPs), is completely disjoint from that of TCP ports. Code may set up a UDP server on port 7654 as follows: */ #include <stdio.h> #include <errno.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <unistd.h> /* for close() for socket */ #include <stdlib.h> int main(void) { int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); struct sockaddr_in sa; char buffer[1024]; ssize_t recsize; socklen_t fromlen; memset(&sa, 0, sizeof sa); sa.sin_family = AF_INET; sa.sin_addr.s_addr = htonl(INADDR_ANY); sa.sin_port = htons(7654); fromlen = sizeof(sa); if (-1 == bind(sock,(struct sockaddr *)&sa, sizeof(sa))) { perror("error bind failed"); close(sock); exit(EXIT_FAILURE); } for (;;) { printf ("recv test....\n"); recsize = recvfrom(sock, (void *)buffer, sizeof(buffer), 0, (struct sockaddr *)&sa, &fromlen); if (recsize < 0) { fprintf(stderr, "%s\n", strerror(errno)); exit(EXIT_FAILURE); } printf("recsize: %d\n ", recsize); sleep(1); printf("datagram: %.*s\n", (int)recsize, buffer); } } /* This infinite loop receives any UDP datagrams to port 7654 using recvfrom(). It uses the parameters: socket pointer to buffer for data size of buffer flags (same as in recv or other receive socket function) address struct of sending peer length of address struct of sending peer. */
Client
/* A simple demonstration of sending a UDP packet containing the string "Hello World!" to address 127.0.0.1 and port 7654 might look like this: */ #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <unistd.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { int sock; struct sockaddr_in sa; int bytes_sent; char buffer[200]; strcpy(buffer, "hello world!"); //create an internet, datagram, socket using UDP sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if (-1 == sock) /* if socket failed to initialize, exit */ { printf("Error Creating Socket"); exit(EXIT_FAILURE); } //Zero out socket address memset(&sa, 0, sizeof sa); //The address is ipv4 sa.sin_family = AF_INET; //ip_v4 adresses is a uint32_t, convert a string representation of the octets to the appropriate value sa.sin_addr.s_addr = inet_addr("127.0.0.1"); //sockets are unsigned shorts, htons(x) ensures x is in network byte order, set the port to 7654 sa.sin_port = htons(7654); //sendto(int socket, char data, int dataLength, flags, destinationAddress, int destinationStructureLength) bytes_sent = sendto(sock, buffer, strlen(buffer), 0,(struct sockaddr*)&sa, sizeof sa); if (bytes_sent < 0) { printf("Error sending packet: %s\n", strerror(errno)); exit(EXIT_FAILURE); } close(sock); /* close the socket */ return 0; } /* In this code, buffer is a pointer to the data to be sent, and buffer_length specifies the size of the data. */
Link:BSD Socket Wiki 一下
BSD Socket~UDP~Code examples
时间: 2024-11-02 18:40:10