0
点赞
收藏
分享

微信扫一扫

Socket初体验 C/S模式开发模型

梦为马 2022-04-30 阅读 55

运行效果

Linux客户端开发代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<iostream>
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 666
using namespace std;

//客户端开发
int main(int argc, char *argv[])
{
	//echo_client "This is a test."
	//argc == 2
	//argv[0] 和 argv[1] 分别指向 echo_cilent 和 "This is a test."
	int sockfd;
	char *message;
	struct sockaddr_in server_addr;//服务器地址标签
	int len;
	char buf[256];
	if(argc != 2)
	{
		fputs("Usage: ./echo_client message \n", stderr);
		exit(1);
	}

	message = argv[1];
	printf("message:%s\n", message);

	//客户端连接服务端 TCP协议的固定写法
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	//设置服务器地址标签
	memset(&server_addr, 0, sizeof(struct sockaddr_in));
	server_addr.sin_family = AF_INET;
	//用到一些调整字节序的函数
	inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);
	server_addr.sin_port = htons(SERVER_PORT);
	//建立C/S连接
	connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
	//往服务端写入数据
	write(sockfd, message, strlen(message));
	len = read(sockfd, buf, sizeof(buf)-1);
	if(len>0)
	{
		//成功从服务器接收到数据
		buf[len] = '\0';
		printf("receive:%s\n", buf);	
	}	
	else
	{
		perror("error");
	}
	printf("finished.\n");
	close(sockfd);//关闭socket	
	
	return 0; 	
}

Linux服务端开发代码

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<ctype.h>
#include<arpa/inet.h>
#include<iostream>
#define SERVER_PORT 666
using namespace std;

//服务端开发
int main(void)
{
	//准备信箱
	int sock;
	struct sockaddr_in server_addr;
	//创建信箱
	sock = socket(AF_INET, SOCK_STREAM, 0);
	//初始化结构体标签 写上地址和端口号
	bzero(&server_addr,sizeof(server_addr));
	server_addr.sin_family = AF_INET;//指定协议家族IPV4
	server_addr.sin_addr.s_addr = htons(INADDR_ANY);//监听所有本地IP地址
	server_addr.sin_port = htons(SERVER_PORT);
	//用结构体标签初始化信箱
	bind(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));
	//启用信箱 同一时刻最多接收128封来信	
	listen(sock, 128);
	//等待客户端连接
	cout<<"等待客户端连接"<<endl;

	while(1)
	{
		//客户端的标签 寄信者的信息
		struct sockaddr_in client;
		socklen_t client_addr_len;
		client_addr_len = sizeof(client);
		char client_ip[64];
		char buf[256];
		//创建一个用于回信的socket	
		int client_sock = accept(sock, (struct sockaddr*)&client, &client_addr_len);
		//打印客户端信息
		printf("client ip:%s\tport:%d\n",
			inet_ntop(AF_INET,&client.sin_addr.s_addr,
			client_ip,sizeof(client_ip)),ntohs(client.sin_port));
		//读入客户端发送的数据
		int len = read(client_sock, buf, sizeof(buf)-1);//最大读取到255个字符 留一个给\0
		buf[len] = '\0';//要手动加上字符串结束符
		printf("receive len:%d\tbuf:%s\n", len, buf);	
		//写回客户端
		len = write(client_sock, buf, len);
		printf("write finished. len:%d\n", len);
		close(client_sock);//关闭socket
	}

	return 0;
}
举报

相关推荐

0 条评论