计算机网络三work

/*
 ============================================================================
 Name        : work5.c
 Author      : yuanhuan
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <unistd.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#include <error.h>

void fun(int);

int main(int argc,char *argv[])
{
    int fd;
    struct hostent *he;
    struct sockaddr_in server;//服务器地址
    struct  sigaction act;
    act.sa_handler = fun;
    act.sa_flags = SA_RESTART;//设置自动重启

    if(argc!=2)
    {
        printf("Usage:%s<IP adderss> \n",argv[0]);
        exit(-1);
    }

    if((he=gethostbyname(argv[1]))==NULL)
    {
    	perror("gethostbyname error.");
    	exit(1);
    }

    if((fd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
    	perror("creat socket failed");
    	exit(1);
    }
    sigaction(SIGINT, &act, NULL);

    bzero(&server,sizeof(server));
    server.sin_family=AF_INET;
    server.sin_port=htons(80);
    server.sin_addr=*((struct in_addr *)he->h_addr);

    if(connect(fd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
    {
    	printf("connect error.\n");
    }
    else
    {
 	printf("connect sucessed.\n");
    }
    close(fd);
}
void fun(int sig)
{
    printf("in signal function.\n");
}


```c
在这里插入代码片

第五次

```c
#include <unistd.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#include <error.h>

void fun(int);

int main(int argc,char *argv[])
{
    int fd;
    struct hostent *he;
    struct sockaddr_in server;//服务器地址
    struct  sigaction act;
    act.sa_handler = fun;
    act.sa_flags = SA_RESTART;//设置自动重启
    
    if(argc!=2)
    {
        printf("Usage:%s<IP adderss> \n",argv[0]);
        exit(-1);
    }

    if((he=gethostbyname(argv[1]))==NULL)
    {
    	perror("gethostbyname error.");
    	exit(1);
    }

    if((fd=socket(AF_INET,SOCK_STREAM,0))==-1)  
    {
    	perror("creat socket failed");
    	exit(1);
    }
    sigaction(SIGINT, &act, NULL);
    
    bzero(&server,sizeof(server));
    server.sin_family=AF_INET;
    server.sin_port=htons(80);
    server.sin_addr=*((struct in_addr *)he->h_addr); 
  
    if(connect(fd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1) 
    { 
    	printf("connect error.\n");
    }
    else  
    {
 	printf("connect sucessed.\n");
    }
    close(fd);
}
void fun(int sig)
{
    printf("in signal function.\n");
}

第四次
c版本
服务器4


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <pthread.h>

#define PORT 5050

#define BACKLOG	5
#define MAXDATASIZE	1000
typedef struct CLIENT {
	int fd;
	char *name;
	struct sockaddr_in addr;
	char *data;
} CLIENT;
void process_cli(struct CLIENT *client, char *recvbuf, int len);
void savedata(char *recvbuf, int len, char *data);

int main() {
	int i, maxi, maxfd, sockfd;
	int nready;
	ssize_t n;
	fd_set rset, allset;
	int listenfd, connectfd;
	struct sockaddr_in server;
	struct CLIENT client[FD_SETSIZE];
	char recvbuf[MAXDATASIZE];
	int sin_size;
	if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
		perror("Create socket failed.");
		exit(-1);
	}
	int opt = SO_REUSEADDR;
	setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
	bzero(&server, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(PORT);
	server.sin_addr.s_addr = htonl(INADDR_ANY );
	if ((bind(listenfd, (struct sockaddr *) &server, sizeof(server))) == -1) {
		perror("bind error.");
		exit(1);
	}
	if ((listen(listenfd, BACKLOG)) == -1) {
		perror("listen error.");
		exit(1);
	}

	sin_size = sizeof(struct sockaddr_in);
	maxfd = listenfd;
	maxi = -1;
	for (i = 0; i < FD_SETSIZE; i++)
		client[i].fd = -1;
	FD_ZERO(&allset);
	FD_SET(listenfd, &allset);
	while (1) {
		struct sockaddr_in addr;
		rset = allset;
		nready = select(maxfd + 1, &rset, NULL, NULL, NULL );
		if (FD_ISSET(listenfd, &rset)) {
			if ((connectfd = accept(listenfd, (struct sockaddr *) &addr,
					&sin_size)) == -1) {
				perror("accept error.");
				continue;
			}
			for (i = 0; i < FD_SETSIZE; i++)
				if (client[i].fd < 0) {
					client[i].fd = connectfd;
					client[i].name = malloc(sizeof(char) * MAXDATASIZE);
					client[i].addr = addr;
					client[i].data = malloc(sizeof(char) * MAXDATASIZE);
					client[i].name[0] = '\0';
					client[i].data[0] = '\0';
					printf("You got a connection from client IP:%s, PORT:%d\n",
							inet_ntoa(client[i].addr.sin_addr),
							ntohs(client[i].addr.sin_port));
					char buf[] = "Welcome sever conection! \n)";
					send(connectfd, buf, sizeof(buf), 0);
					break;
				}
			if (i == FD_SETSIZE) {
				printf("too many cllients.\n");
			}
			FD_SET(connectfd, &allset);
			if (connectfd > maxfd)
				maxfd = connectfd;
			if (i > maxi)
				maxi = i;
			if (--nready <= 0)
				continue;
		}
		for (i = 0; i <= maxi; i++) {
			if ((sockfd = client[i].fd) < 0)
				continue;
			if (FD_ISSET(sockfd, &rset)) {
				if ((n = recv(sockfd, recvbuf, MAXDATASIZE, 0)) == 0) {
					close(sockfd);
					printf("Client (%s) closed connection. User’s data: %s\n",
							client[i].name, client[i].data);
					FD_CLR(sockfd, &allset);
					client[i].fd = -1;
					free(client[i].name);
					free(client[i].data);
				} else
					process_cli(&client[i], recvbuf, n);
				if (--nready <= 0)
					break;
			}
		}
	}
	close(listenfd);
}

void savedata(char *recvbuf, int len, char *data) {
	int start = strlen(data);
	int i;
	for (i = 0; i < len; i++) {
		data[start + i] = recvbuf[i];
	}

}
void process_cli(CLIENT *client, char *recvbuf, int len) {
	int j;
	char sendbuf[MAXDATASIZE];
	recvbuf[len] = '\0';
	if (strlen(client->name) == 0) {
		memcpy(client->name, recvbuf, len);
		printf("Client'sname is %s.\n", client->name);
		return;
	}
	printf("Receivedclient( %s ) message: %s\n", client->name, recvbuf);
	savedata(recvbuf, len, client->data);
	for (j = 0; j < len; j++) {
		sendbuf[j] = recvbuf[j];
	}
	sendbuf[len] = '\0';
	printf("[>] Send reverse string:%s\n", sendbuf);
	if ((send(client->fd, sendbuf, strlen(sendbuf), 0)) == -1) {
		perror("send error.");
		exit(1);
	}
}





        

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 5050
#define MAXDATASIZE 100
int main(int argc, char* argv[]) {
	int socketfd;
	char send_buf[MAXDATASIZE], recv_buf[MAXDATASIZE], buf[MAXDATASIZE];
	struct hostent* remote_host;
	struct sockaddr_in server;
	if (argc != 2) {
		printf("Usage:%s <IP address>\n", argv[0]);
		exit(1);
	}
	if ((remote_host = gethostbyname(argv[1])) == NULL ) {
		perror("gethostbyname error.");
		exit(1);
	}
	if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
		perror("socket error.");
		exit(1);
	}
	bzero(&server, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(PORT);
	server.sin_addr = *((struct in_addr*) remote_host->h_addr);
	if ((connect(socketfd, (struct sockaddr*) &server, sizeof(server))) == -1) {
		perror("connect error.");
		exit(1);
	}
	if ((recv(socketfd, buf, MAXDATASIZE, 0)) == -1) {
		perror("you Receive welcome message fail.");
		exit(1);
	}
	buf[sizeof(buf) - 1] = '\0';
	printf("%s\n", buf);
	printf("Please input your name:");
	scanf("%s", buf);
	if ((send(socketfd, buf, MAXDATASIZE, 0)) == -1) {
		perror("send name error.");
		exit(1);
	}
	while (1) {
		printf("[*] Input string:");
		scanf("%s", send_buf);
		send_buf[strlen(send_buf)] = '\0';
		if ((strlen(send_buf)) > 100) {
			printf("your buf is more than 100,the biggest buf is 100.");
			exit(1);
		}
		if ((send(socketfd, send_buf, MAXDATASIZE, 0)) == -1) {
			perror("send error.");
			exit(1);
		}
		if ((recv(socketfd, recv_buf, MAXDATASIZE, 0)) == -1) {
			perror("recv error.");
			exit(1);
		}
		if (!strcmp(recv_buf, "over")) {
			close(socketfd);
			break;
		}
	}
	close(socketfd);
	return 0;
}



服务器3

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 9999
#define BACKLOG 2
#define MAXDATASIZE 100
void process_cli(int connectfd, struct sockaddr_in client);
void *start_routine(void *arg);
struct ARG {
	int connfd;
	struct sockaddr_in client;
};
int main(void) {
	int listenfd, connectfd;
	pthread_t tid;
	struct ARG * arg;
	struct sockaddr_in server, client;
	int sin_size;
	if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
		perror("Create socket failed.");
		exit(-1);
	}
	int opt = SO_REUSEADDR;
	setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
	bzero(&server, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(PORT);
	server.sin_addr.s_addr = htonl(INADDR_ANY);
	if (bind(listenfd, (struct sockaddr *) &server, sizeof(struct sockaddr))
			== -1) {
		perror("Bind error.");
		exit(-1);
	}
	if (listen(listenfd, BACKLOG) == -1) {
		perror("listen error.");

		exit(-1);
	}
	sin_size=sizeof(struct sockaddr_in);
	while (1) {

		if ((connectfd=accept(listenfd,(struct sockaddr*)&client,&sin_size))==-1) {
			perror("accept error.");
			exit(-1);
		}
		arg = (struct ARG*) malloc(sizeof(struct ARG));
		arg->connfd = connectfd;
		memcpy((void *) &arg->client, &client, sizeof(client));
		if (pthread_create(&tid, NULL, start_routine, (void *) arg)) {
			perror("Creat pthread error.");
			exit(-1);
		}
	}
	close(listenfd);
}
	void process_cli(int connectfd, struct sockaddr_in client) {
		char recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE],
				client_name[MAXDATASIZE];
		int recvlen, i;
		printf("You got a connection from %s.\n", inet_ntoa(client.sin_addr));
		send(connectfd, " 'Welcome to my server.(n", 22, 0);
		recvlen = recv(connectfd, client_name, MAXDATASIZE, 0);
		if (recvlen == 0) {
			close(connectfd);
			printf("client disconnectde.(n");
			return;
		} else if (recvlen < 0) {
			close(connectfd);
			printf("client broked.\n");
			return;
		}
		client_name[recvlen] = '\0';
		printf("Client name is %s.\n", client_name);
		while ((recvlen = recv(connectfd, recvbuf, MAXDATASIZE, 0))) {
			recvbuf[recvlen] = '\0';
			printf("Received client< %s > message: %s.\n", client_name, recvbuf);
			for (i = 0; i < recvlen; i++)
				sendbuf[i] = recvbuf[recvlen - i - 1];
			sendbuf[recvlen] = '\0';
			send(connectfd, sendbuf, strlen(sendbuf), 0);
		}
			printf("Client:%s disconnected.\n", client_name);
			close(connectfd);
	}
		void *start_routine(void *arg) {
			struct ARG *info;
			info = (struct ARG *) arg;
			process_cli(info->connfd, info->client);
			free(arg);
			pthread_exit(NULL );
		}

客服端

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#define PORT 9999
#define MAXDATASIZE 100
int main(int argc, char *argv[]) {
	int fd, numbytes;
	char buf[MAXDATASIZE];
	struct hostent * he;
	struct sockaddr_in server;
	int i = 1;
	if (argc != 2) {
		printf("Usage: %s <lP address>\n", argv[0]);
		exit(-1);
	}
	if ((he = gethostbyname(argv[1])) == NULL ) {
		perror("gethostbyname error.");
		exit(-1);
	}
	if ((fd = socket(AF_INET, SOCK_STREAM,0)) == -1) {
		perror("Create socket failed.");
		exit(1);
	}
	bzero(&server, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(PORT);
	server.sin_addr = *((struct in_addr *) he->h_addr);
	if ((i = connect(fd, (struct sockaddr *) &server, sizeof(struct sockaddr))== -1)) {
		perror("connect failed.");
		exit(1);
	}
	if (((numbytes = recv(fd, buf, MAXDATASIZE, 0)) == -1)) {
		perror("recv error.");
		exit(1);
	}
	buf[numbytes] = '\0';
	printf("Server Message: %s", buf);
	printf("Please input your name:");
	scanf("%s", buf);
	if (((numbytes = send(fd, buf, strlen(buf), 0)) == -1)) {
		perror("send error.");
		exit(1);
	}
	while (1) {
		printf("Please input message(max char:%d):", MAXDATASIZE);
		scanf("%s", buf);
		if (strlen(buf) < 1)
			i = 0;
		if (((numbytes = send(fd, buf, strlen(buf), 0)) == -1)) {
			perror("send error.");
			exit(1);
		}
		if (((numbytes = recv(fd, buf, MAXDATASIZE, 0)) == -1)) {
			perror("read error.");
			exit(1);
		}
		buf[numbytes] = '\0';
		printf("Server message:%s\n", buf);
		printf("\n");
		}
	close(fd);
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值