网络编程第八次作业(2024.8.20)

服务器:

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

struct TCP_data{
	struct sockaddr_in tcp;
	int id;
};


void* serve_recv(void* c){
	struct TCP_data *client = c;
	char buf[100] = {0};
	while(strcmp(buf,"end\n")!=0){
		//接收消息
		int jump = recv(client->id,buf,100,0);
		if(jump!=0&&jump!=-1)
			printf("客户端IP为:%s\n端口号为:%d\n发来数据为:%s\n",inet_ntoa(client->tcp.sin_addr),ntohs(client->tcp.sin_port),buf);
		else
			break;
		memset(buf,0,100);
	}
	printf("已退出!\n");
	close(client->id);
	return NULL;
}

void* serve_send(void* c){
	struct TCP_data *client = c;
	char buf[100] = {0};
	while(strcmp(buf,"end\n")!=0){
		//发送
		fgets(buf,100,stdin);
		int jump = send(client->id,buf,100,MSG_NOSIGNAL);
		if(jump!=0&&jump!=-1)
			printf("接收端IP为:%s\n端口号为:%d\n发送数据为:%s\n",inet_ntoa(client->tcp.sin_addr),ntohs(client->tcp.sin_port),buf);
		else
			break;
		memset(buf,0,100);
	}
	printf("已退出!\n");
	close(client->id);
	return NULL;
}



int main(int argc, char *argv[]){
	if(argc!=3){
		printf("传参有误!\n");
		return 0;
	}
	//创建套接字
	int sock_fd = socket(AF_INET,SOCK_STREAM,0);
	if(-1 == sock_fd){
		perror("创建套接字失败!\n");
		return -1;
	}
	//绑定服务器
	struct sockaddr_in serve;
	serve.sin_family = AF_INET;
	serve.sin_port = htons(atoi(argv[2]));
	serve.sin_addr.s_addr = inet_addr(argv[1]);
	int ret = bind(sock_fd, (struct sockaddr *)&serve, sizeof(serve));
	if(ret == -1){
		perror("绑定失败!\n");
	}
	int listen_ret = listen(sock_fd,4);
	if(listen_ret == -1){
		perror("监听模式设置失败!\n");
	}
	struct sockaddr_in *client = calloc(4,sizeof(struct sockaddr_in));
	int i=0,j=0;
	socklen_t size=sizeof(struct sockaddr_in);
	pthread_t tid[4];
	//等待连接
	while(1){
		struct TCP_data data;
		data.id = accept(sock_fd,(struct sockaddr*)(client+i),&size);
		data.tcp = *(client+i);
		if(data.id!=-1){i++;if(i==4)i=0;}
		if(i!=j){
    		if(pthread_create(tid+j,NULL,serve_send,(void*)&data)){
				printf("线程创建失败!\n");
				return -1;
			}
			if(pthread_create(tid+j,NULL,serve_recv,(void*)&data)){
				printf("线程创建失败!\n");
				return -1;
			}
			j=i;
		}
	}
	close(sock_fd);
	return 0;
}

客户端:

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

int sock_fd;

void* client_recv(void* c){
	struct sockaddr_in *client = c;
	char buf[100] = {0};
	while(strcmp(buf,"end\n")!=0){
		//接收消息
		int jump = recv(sock_fd,buf,100,0);
		if(jump!=0&&jump!=-1)
			printf("服务端IP为:%s\n端口号为:%d\n发来数据为:%s\n",inet_ntoa(client->sin_addr),ntohs(client->sin_port),buf);
		else
			break;
		memset(buf,0,100);
	}
	exit(0);
}

int main(int argc, char *argv[])
{
	if(argc!=3){
		printf("传参有误!\n");
		return 0;
	}
	//创建套接字
	sock_fd = socket(AF_INET,SOCK_STREAM,0);
	if(-1 == sock_fd){
		perror("创建套接字失败!\n");
		return -1;
	}
	//绑定服务器
	struct sockaddr_in serve;
	serve.sin_family = AF_INET;
	serve.sin_port = htons(atoi(argv[2]));
	serve.sin_addr.s_addr = inet_addr(argv[1]);
	//链接
	int con = connect(sock_fd,(struct sockaddr*)&serve,sizeof(serve));
	if(-1 == con){
		printf("连接失败!\n");
	}
	pthread_t tid;
	if(pthread_create(&tid,NULL,client_recv,(void*)&serve)){
		printf("线程创建失败!\n");
		return -1;
	}
	char *buf = calloc(1,100);
	//畅聊
	while(strcmp(buf,"end\n")){
		//向主机发送消息
		fgets(buf,100,stdin);
		send(sock_fd, buf, 100, MSG_NOSIGNAL);
		printf("发送为:%s\n",buf);
		memset(buf,0,100);
	}
	close(sock_fd);
	return 0;
}

退出有瑕疵,懒得改了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值