网络编程之三

【代码1】chat_tcp_client1.c

 

#include "header.h"

int main(int argc, char *argv[])
{
	int connfd = -1;
	
	if (0 > (connfd = socket(AF_INET, SOCK_STREAM, 0)))
		err_exit("socket");
	
	struct sockaddr_in server;
	
	bzero(&server, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(8888);
	server.sin_addr.s_addr = inet_addr("192.168.80.128");
	
	
	if ( 0 > connect(connfd, (struct sockaddr *)&server, sizeof(server)))
		err_exit("connect");
	
	printf("connect success!\n");
	char w_buf[BUFSIZ];
	char r_buf[BUFSIZ];
	int ret;
	fd_set readfds;
	int maxfd = -1;
	int i;
	
	while(1) {
		FD_ZERO(&readfds);
		FD_SET(0, &readfds);
		maxfd = 0 > maxfd ? 0 : maxfd;

		FD_SET(connfd, &readfds);
		maxfd = connfd > maxfd ? connfd : maxfd;
		ret = select(maxfd + 1, &readfds, NULL, NULL, NULL);
		if (0 > ret)
			err_exit("select");
		else {
			for (i = 0; i <= maxfd; i++) {
				if (FD_ISSET(i, &readfds)) {
					if (0 == i) {
						fgets(w_buf, sizeof(w_buf), stdin);
						if (!strncmp(w_buf, "quit", 4)) {
							fprintf(stderr, "client quit!\n");
							exit(0);
						}
						send(connfd, w_buf, strlen(w_buf) + 1, 0);					
					} else if (connfd == i) {
						ret = recv(connfd, r_buf, sizeof(r_buf), 0);
						if (ret < 0)
							err_exit("recv");
						else if (ret == 0) {
							printf("server quit!\n");
							exit(0);
						}
						printf("server : %s", r_buf);						
					}
				}
			}
		}	
	}
	close(connfd);
	
	exit(0);
}

 

【代码2】chat_tcp_serve1r.c

 

#include "header.h"

int main(int argc, char *argv[])
{
	int listenfd = -1;
	
	if (0 > (listenfd = socket(AF_INET, SOCK_STREAM, 0)))
		err_exit("socket");
	
	struct sockaddr_in server, client;
	
	bzero(&server, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(8888);
	/* server.sin_addr.s_addr = inet_addr("192.168.80.128"); */
	/* inet_aton("192.168.80.128", &server.sin_addr); */
	server.sin_addr.s_addr = htonl(INADDR_ANY);
	/* server.sin_addr.s_addr = inet_addr("0"); */
	
	int on = 1;
	
	if (0 > setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)))
		err_exit("setsockopt");
	
	if (0 > bind(listenfd, (struct sockaddr *)&server, sizeof(server)))
		err_exit("bind");

	listen(listenfd, 1024);
	printf("listen...\n");
	bzero(&client, sizeof(client));
	socklen_t len = sizeof(client);  // must be done!
	int connfd = -1;
	
	if ( 0 > (connfd = accept(listenfd, (struct sockaddr *)&client, &len)))
		err_exit("accept");

	printf("client ip is %s, port number is %d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
	char w_buf[BUFSIZ];
	char r_buf[BUFSIZ];
	int ret;
	fd_set readfds;
	int maxfd = -1;
	int i;
	
	while(1) {
		FD_ZERO(&readfds);
		FD_SET(0, &readfds);
		maxfd = 0 > maxfd ? 0 : maxfd;  // 0 -- stdin
		FD_SET(connfd, &readfds);
		maxfd = connfd > maxfd ? connfd : maxfd; // connfd -- socket for communication
		ret = select(maxfd + 1, &readfds, NULL, NULL, NULL);
		if (0 > ret)
			err_exit("select");
		else {
			for (i = 0; i <= maxfd; i++) {
				if (FD_ISSET(i, &readfds)) {
					if (0 == i) {
						fgets(w_buf, sizeof(w_buf), stdin);
						if (!strncmp(w_buf, "quit", 4)) {
							printf("server quit!\n");
							exit(0);
						}
						if (0 > send(connfd, w_buf, strlen(w_buf) + 1, 0))
							err_exit("send");					
					} else if (connfd == i) {
						ret = recv(connfd, r_buf, sizeof(r_buf), 0);
						if (ret < 0)
							err_exit("recv");
						else if (ret == 0) {
							printf("client quit!\n");
							exit(0);
						}
						printf("client : %s", r_buf);					
					}
				}
			}
		}
	}	
	
	close(listenfd);
	close(connfd);
	
	exit(0);
}

 

【代码3】test_select.c

 

#include "header.h"
#include <fcntl.h>

int main(int argc, char *argv[])
{
	fd_set readfds;
	struct timeval tm;
	int ret;
	
	memset(&tm, 0, sizeof(tm));

	char buf[32];
	
	while(1) {
		FD_ZERO(&readfds);
		FD_SET(0, &readfds);
		tm.tv_sec = 2;
		tm.tv_usec = 0;		
		ret = select(1, &readfds, NULL, NULL, &tm);
		if (0 > ret)
			err_exit("select");
		else if (0 == ret) {
			printf("timeout!\n");
		} else {
			fgets(buf, sizeof(buf), stdin);
			printf("fgets : %s", buf);
			fflush(stdout);
		}		
	}

	exit(0);
}

 

【代码4】test_udp_client.c

 

#include "header.h"

int main(int argc, char *argv[])
{
	if (3 > argc) {
		fprintf(stderr, "Usage : %s + server IP + portnumber\n", argv[0]);
		exit(1);
	}

	unsigned short port;
	/* printf("%d\n",atoi(argv[1])); */
	
	if (0 >= (port = atoi(argv[2]))) {
		fprintf(stderr, "port number is invalid!\n");
		exit(1);
	}
	
	int connfd = -1;
	if (0 > (connfd = socket(AF_INET, SOCK_DGRAM, 0)))
		err_exit("socket");

	struct sockaddr_in server;
	memset(&server, 0, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(port);
	inet_aton(argv[1], &server.sin_addr);

	
	char buf[BUFSIZ];
	/* struct sockaddr_in client; */
	/* memset(&client, 0, sizeof(client)); */
	/* socklen_t len = sizeof(client);  /\* must be done! *\/ */
	
	while(1) {
		fgets(buf, sizeof(buf), stdin);
		sendto(connfd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&server, sizeof(server));	
		recvfrom(connfd, buf, sizeof(buf), 0, NULL, NULL);
		//printf("client(ip : %s, port : %d) : %s", inet_ntoa(client.sin_addr), ntohs(client.sin_port), buf);
		printf("%s", buf);
	}
	close(connfd);
	exit(0);
}

 

【代码5】test_udp_server.c

 

#include "header.h"

int main(int argc, char *argv[])
{
	if (2 > argc) {
		fprintf(stderr, "Usage : %s + portnumber\n", argv[0]);
		exit(1);
	}

	unsigned short port;
	/* printf("%d\n",atoi(argv[1])); */
	
	if (0 >= (port = atoi(argv[1]))) {
		fprintf(stderr, "port number is invalid!\n");
		exit(1);
	}
	
	int connfd = -1;
	if (0 > (connfd = socket(AF_INET, SOCK_DGRAM, 0)))
		err_exit("socket");

	struct sockaddr_in server;
	memset(&server, 0, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(port);
	server.sin_addr.s_addr = htonl(INADDR_ANY);

	if (0 > bind(connfd, (struct sockaddr *)&server, sizeof(server)))
		err_exit("bind");
	
	char buf[BUFSIZ];
	struct sockaddr_in client;
	memset(&client, 0, sizeof(client));
	socklen_t len = sizeof(client);  /* must be done! */
	
	while(1) {
		recvfrom(connfd, buf, sizeof(buf), 0, (struct sockaddr *)&client, &len);
		printf("client(ip : %s, port : %d) : %s", inet_ntoa(client.sin_addr), ntohs(client.sin_port), buf);
		fgets(buf, sizeof(buf), stdin);
		sendto(connfd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&client, sizeof(client));
	}
	close(connfd);
	exit(0);
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值