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

📄 example75.c

📁 Linux网络编程教程适合初学者入门学习
💻 C
字号:
/* example75.c */

#include	<sys/types.h>

#include	<sys/socket.h>

#include	<arpa/inet.h>

#include	<errno.h>

#include	<fcntl.h>

#include	<stdio.h>

#define		BUFLEN		255



int

main(int argc, char **argv)

{

	struct sockaddr_in servaddr, localaddr;

	int sockfd, stdinfd, i, n, flags;

	int STDIN_EOF = 0, pos = 0;

	char curline[BUFLEN+1], sndmsg[65535], rcvmsg[BUFLEN + 1];

	if (argc != 2) {

		printf("%s <IP address>\n", argv[0]);

		exit(0);

	}

	sockfd = socket(AF_INET, SOCK_STREAM, 0);

	if (sockfd < 0) {

		fprintf(stderr, "socket creating error in nbechocli.c\n");

		exit(1);

	}

	memset(&servaddr, 0, sizeof(struct sockaddr_in));

	servaddr.sin_family = AF_INET;

	servaddr.sin_port = htons(1234);

	if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {

		printf("Wrong IP address!\n");

		exit(0);

	}

	if (connect(sockfd, (struct sockaddr*)(&servaddr), sizeof(struct sockaddr_in)) < 0) 

{

		printf("Connection Failure!\n");

		exit(0);

	}

	printf("Connected to host %s\n", argv[1]);

	flags = fcntl(sockfd, F_GETFL, 0);

	flags |= O_NONBLOCK;

	fcntl(sockfd, F_SETFL, flags);

	stdinfd = fileno(stdin);

	flags = fcntl(sockfd, F_GETFL, 0);

	flags |= O_NONBLOCK;

	fcntl(stdinfd, F_SETFL, flags);

	for ( ; ; ) {

		n = read(sockfd, rcvmsg, BUFLEN);

		switch (n) {

			case 0:

				printf("server shutdown the connection!\n");

				exit(0);

				break;

			case -1:

				if (errno != EWOULDBLOCK) {

					fprintf(stderr, "connection abnormally closed 

in nbechocli.c!\n");

					perror("");

					exit(2);

				}

				break;

			default:

				rcvmsg[n] = 0;

				printf("%s", rcvmsg);

		}

		if (!STDIN_EOF) {

			n = read(stdinfd, curline, BUFLEN);

			switch (n) {

				case 0:

					printf("get eof, connection closed!\n");

					STDIN_EOF = 1;

					if (pos == 0)

						shutdown(sockfd, 1);

					break;

				case -1:

					if (errno != EWOULDBLOCK) {

						fprintf(stderr, "error happened in stdin in nbechocli.c\n");

						perror("");

						exit(3);

					}

					break;

				default:

					curline[n] = 0;

					strcpy(sndmsg + pos, curline);

					pos += (n + 1);

			}

		}

		if (pos > 0) {

			n = write(sockfd, sndmsg, strlen(sndmsg));

			if (n == -1) {

				if (errno != EWOULDBLOCK) {

					fprintf(stderr, "socket write error in n bechocli.c!\n");

					exit(4);

				}

			}

			else {

				for (i = n + 1; i < pos; i++)

					sndmsg[i-n-1] = sndmsg[i];

				pos -= (n+1);

				if (pos == 0)

					if (STDIN_EOF)

						shutdown(sockfd, 1);

			}

		}

	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -