📄 example74.c
字号:
/* example74.c */
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#define BUFLEN 255
int
main(int argc, char **argv)
{
struct sockaddr_in peeraddr, localaddr;
int sockfd, stdinfd, n, maxfd, socklen, flags;
char msg[BUFLEN + 1];
fd_set infds;
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);
}
flags = fcntl(sockfd, F_GETFL, 0);
flags |= O_NONBLOCK;
fcntl(sockfd, F_SETFL, 0);
stdinfd = fileno(stdin);
flags = (fcntl(stdinfd, F_GETFL, 0));
flags |= O_NONBLOCK;
fcntl(stdinfd, F_SETFL, flags);
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(2);
}
connect(sockfd, &localaddr, socklen);
for ( ; ; ) {
n = read(sockfd, &peeraddr, socklen);
if (n == -1) {
if (errno != EWOULDBLOCK) {
printf("talk colsed by peer\n");
exit(3);
}
}
else {
msg[n] = 0;
printf("peer: %s", msg);
}
n = read(stdinfd, msg, BUFLEN);
switch(n) {
case -1:
if (errno != EWOULDBLOCK) {
fprintf(stderr, "stdin error\n");
exit(4);
}
break;
case 0:
printf("talk over!\n");
exit(0);
break;
default:
write(sockfd, msg, n);
msg[n] = 0;
printf("sent: %s", msg);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -