📄 example73.c
字号:
/* example73.c */
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#define BUFLEN 255
void alarmed();
int
main(int argc, char **argv)
{
struct sockaddr_in peeraddr, recvaddr, localaddr;
int sockfd;
char recmsg[BUFLEN + 1];
int socklen, n;
int rcvto = 3;
struct sigaction alrmact;
memset(&alrmact, 0, sizeof(struct sigaction));
alrmact.sa_handler = alarmed;
alrmact.sa_flags = SA_NOMASK;
alrmact.sa_restorer = NULL;
sigaction(SIGALRM, &alrmact, NULL);
if (argc != 5) {
printf("%s <dest IP address> <dest port> <source IP address> <source port>\n", argv[0]);
exit(0);
}
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
fprintf(stderr, "socket creating error in udptalk.c!\n");
exit(0);
}
socklen = sizeof(struct sockaddr_in);
memset(&peeraddr, 0, socklen);
peeraddr.sin_family = AF_INET;
peeraddr.sin_port = htons(atoi(argv[2]));
if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) <= 0) {
printf("Wrong dest IP address!\n");
exit(0);
}
memset(&localaddr, 0, socklen);
localaddr.sin_family = AF_INET;
if (inet_pton(AF_INET, argv[3], &localaddr.sin_addr) <= 0) {
printf("Wrong source IP address!\n");
exit(0);
}
localaddr.sin_port = htons(atoi(argv[4]));
if (bind(sockfd, &localaddr, socklen) < 0) {
fprintf(stderr, "bind local address error in udptalk.c!\n");
exit(0);
}
if (fgets(recmsg, BUFLEN, stdin) == NULL)
exit(0);
if (sendto(sockfd, recmsg, strlen(recmsg), 0, &peeraddr, socklen) < 0) {
fprintf(stderr, "sendto error in udptalk.c!\n");
perror("");
exit(3);
}
for ( ; ; ) {
alarm(rcvto);
n = recvfrom(sockfd, recmsg, BUFLEN, 0, &recvaddr, &socklen);
if (n < 0) {
alarm(0);
if (errno != EINTR) {
fprintf(stderr, "recvfrom error in udptalk.c!\n");
perror("");
exit(4);
}
else
fprintf(stderr, "recvfrom timeout in udptalk.c!\n");
}
else {
if (memcmp(&recvaddr, &peeraddr, socklen) != 0)
continue;
recmsg[n] = 0;
printf("peer:%s", recmsg);
}
if (fgets(recmsg, BUFLEN, stdin) == NULL)
exit(0);
if (sendto(sockfd, recmsg, strlen(recmsg), 0, &peeraddr, socklen) < 0) {
fprintf(stderr, "sendto error in udptalk.c!\n");
perror("");
exit(3);
}
}
}
void
alarmed(int signo)
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -