当前位置: 首页 > article >正文

利用TCP协议实现客户端—服务器端通信

服务器端程序

#include <netdb.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <signal.h>
#include <time.h>
#include <arpa/inet.h>
int sockfd;

void sig_handler(int signo){
	if(signo==SIGINT){
	printf("server close\n");
	close(sockfd);
	exit(1);
	}
}

void out_addr(struct sockaddr_in *clientaddr){
	int port=ntohs(clientaddr->sin_port);
	char ip[16];
	memset(ip,0,sizeof(ip));
	inet_ntop(AF_INET,&clientaddr->sin_addr.s_addr,ip,sizeof(ip));
	printf("client: %s(%d) connected\n",ip,port);
}
void do_service(int fd){
	long t=time(0);
	char *s=ctime(&t);
	size_t size=strlen(s)*sizeof(char);
	if(write(fd,s,size)!=size){
	perror("write error");
}
}

int main(int argc,char *argv[]){
	if(argc<2){
	printf("usage:%s #port\n",argv[0]);
	exit(1);
}	
	if(signal(SIGINT,sig_handler)==SIG_ERR){
	perror("signal sigint error");
	exit(1);
}
	sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(sockfd<0){
	perror("sockfd error");
	exit(1);
}
	struct sockaddr_in serveraddr;
	memset(&serveraddr,0,sizeof(serveraddr));
	serveraddr.sin_family=AF_INET;
	serveraddr.sin_port=htons(atoi(argv[1]));
	serveraddr.sin_addr.s_addr=INADDR_ANY;
	if(bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0){
	perror("bind error");
	exit(1);
	}
	if(listen(sockfd,10)<0){
	perror("listen error");
	exit(1);
}
	struct sockaddr_in clientaddr;
	socklen_t clientaddr_len=sizeof(clientaddr);
	while(1){
	int fd=accept(sockfd,(struct sockaddr*)&clientaddr,&clientaddr_len);
	if(fd<0){
	perror("accept error");
	continue;
}
	out_addr(&clientaddr);
	do_service(fd);
	close(fd);
}


	exit(0);
}

客户端程序

#include <netdb.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(int argc,char *argv[]){
	if(argc<3){
	printf("usage:%s ip #port\n",argv[0]);
	exit(1);
}	
	int sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(sockfd<0){
	perror("socket error");
	exit(1);
}
	struct sockaddr_in serveraddr;
	memset(&serveraddr,0,sizeof(serveraddr));
	serveraddr.sin_family=AF_INET;
	serveraddr.sin_port=htons(atoi(argv[2]));
	inet_pton(AF_INET,argv[1],&serveraddr.sin_addr.s_addr);
	
	if(connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0){
	perror("connect error");
	exit(1);
}

	char buffer[1024];
	memset(buffer,0,sizeof(buffer));
	size_t size;
	if((size=read(sockfd,buffer,sizeof(buffer)))<0){
	perror("read error");
}
	if(write(STDOUT_FILENO,buffer,size)!=size){
	perror("write error");
}

	close(sockfd);

	exit(0);
}


http://www.kler.cn/a/469271.html

相关文章:

  • wordpress开发之实现使用第三方库qrcode-generator生成二维码并上传和展示
  • 线程池与并发工具:Java的分身管理器
  • 【读书与思考】历史是一个好东西
  • 条件期望窥探
  • 外网访问本地部署的 VMware ESXi 服务
  • Qt 5.14.2 学习记录 —— 일 新项目
  • GTX750Ti打DP补丁
  • SQL-leetcode-196. 删除重复的电子邮箱
  • 【服务器项目部署】✈️将本地项目部署到服务器(二)!
  • 【2025最新计算机毕业设计】基于SSM高校校园易换站二手交易平台(高质量源码,可定制,免费部署到本地)
  • UNI-APP弹窗
  • Airflow:HttpSensor实现API驱动数据流程
  • MySQL(三)MySQL DML数据库操作语言
  • Linux硬盘分区 --- gdisk命令GPT分区
  • 基于Springboot的相亲网站系统【附源码】
  • 学习笔记079——数据结构之【树】
  • 开源AI智能名片2+1链动模式S2B2C商城小程序在商业流量获取中的应用研究
  • 【网络协议】IPv4 地址分配 - 第一部分
  • Transformer知识梳理
  • JavaScript 随机 数用法
  • 低空经济来袭,载人无人机研发技术详解
  • c++之左值引用 右值引用 万能引用
  • AI在电子制造中的应用:预测质量控制
  • 深入了解 Python 的 venv 虚拟环境
  • 01、Docker学习,第一天:简单入门与安装
  • 鸿蒙Flutter实战:15-Flutter引擎Impeller鸿蒙化、性能优化与未来