?? udpclient.c
字號:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/select.h>#include <arpa/inet.h>#include <string.h>#include <errno.h>#define BUFFER_SIZE 1024intmain (int argc, char **argv){ int fd; int rand = 0; // XXX: step 1, socket(); int socket (int domain, int type, int protocol); if ((fd = socket (PF_INET, SOCK_DGRAM, 0)) < 0) { fprintf (stderr, "Create a new UDP socket failed: %s\n", strerror (errno)); exit (1); } fd_set rset; fd_set wset; fd_set eset; FD_ZERO (&rset); FD_ZERO (&wset); FD_ZERO (&eset); FD_SET (fd, &eset); FD_SET (fd, &rset); FD_SET (fd, &wset); char line[BUFFER_SIZE] = "hello"; struct sockaddr_in remote_address; ssize_t sent; memset (&remote_address, 0, sizeof (remote_address)); remote_address.sin_family = PF_INET; remote_address.sin_port = htons (atoi (argv[2])); remote_address.sin_addr.s_addr = inet_addr (argv[1]); struct sockaddr_in peer_address; socklen_t peer_address_length; ssize_t recv; peer_address_length = sizeof (peer_address); struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; while (1) { rand = random () % 3;#if _DEBUG_ printf ("%d\n", rand);#endif sleep (rand); //sleep(1); int sel; if ((sel = select (fd + 1, &rset, &wset, &eset, &tv)) < 0) { if (EINTR == errno) { continue; } else { fprintf (stderr, "select failed:%s\n", strerror (errno)); } } else if (0 == sel) { fprintf (stdout, "time out...\n"); } else { if (FD_ISSET (fd, &wset)) { resend: if ((sent = sendto (fd, line, strlen (line), 0, (struct sockaddr *) &remote_address, sizeof (remote_address))) < 0) { if (errno == EINTR) { goto resend; } else { fprintf (stderr, "sendto() failed: %s\n", strerror (errno)); } } else { fprintf (stdout, "Sent %d bytes to remote host.\n", sent); } } } FD_SET(fd,&rset); if ((sel = select (fd + 1, &rset, &wset, &eset, &tv)) < 0) { if (EINTR == errno) { continue; } else { fprintf (stderr, "select failed:%s\n", strerror (errno)); } } else if (0 == sel) { fprintf (stdout, "time out...\n"); } else { if (FD_ISSET (fd, &rset)) {#if _DEBUG_ printf ("enter read\n");#endif re_receive: if ((recv = recvfrom (fd, line, BUFFER_SIZE, 0, (struct sockaddr *) &peer_address, &peer_address_length)) < 0) { if (errno == EINTR) { goto re_receive; } else { fprintf (stderr, "recvfrom() failed: %s\n", strerror (errno)); } } else { fprintf (stdout, "INFO: read %d bytes from %s:%d\n", recv, inet_ntoa (peer_address.sin_addr), ntohs (peer_address.sin_port)); fprintf (stdout, "DEBUG: %s\n", line); } } } } close (fd); return 0;}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -