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

📄 example75.c

📁 Linux套接字中的I_O测试程序
💻 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 + -