⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 example74.c

📁 LinuxNetProgramming Linux网络编程基础实例
💻 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 + -