linux(Ubuntu)使用socket(套接字)实现简单的回声服务器,server(服务器端)/client(客户端)

给大家分享一下学习服务器编程的基础 socket通信的案例 使用C语言

创建服务端文件

vi server.c

开始写我们的服务端代码

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<ctype.h>
#include<arpa/inet.h>

#define SERVER_PORT 666 //宏定义端口号

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 = htonl(INADDR_ANY); //监听所有本地IP 

	
	server_addr.sin_port = htons(SERVER_PORT); //绑定端口号
	// 实现服务器标签贴到信箱
	bind(sock,(struct sockaddr *)&server_addr,sizeof(server_addr) );
	//监听
	listen(sock,128);
	
	printf("等待客户端的链接\n");
	
	int done=1;
	while(done)
	{
		struct sockaddr_in client;
		int client_sock,len;
		char client_ip[64];
		char buff[256];
		
		socklen_t client_addr_len;
		client_addr_len=sizeof(client);
		client_sock =  accept(sock,(struct sockaddr *)&client,&client_addr_len);
			
		//打印客户端地址和端口号
		printf("client ip: %s\t port: %d\n",inet_ntop(AF_INET,&client.sin_addr.s_addr,client_ip,sizeof(client_ip)),ntohs(client.sin_port));
		// 读取客户端发送的数据
		len =  read(client_sock,buff,sizeof(buff)-1);
		
		buff[len] = '\0';		
		
		printf("recive[%d]:%s\n",len,buff);
		
		len = write(client_sock,buff,len);
				
		printf("write finished. len: %d\n",len);
		close(client_sock);
		
	}	
	return 0;

}

创建客户端:

vi client.c

客户端代码:

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

#define SERVER_PORT 666
#define SERVER_IP "127.0.0.1" //本地客户端的ip
int main(int argc,char *argv[])
{
	int sockfd;
	char *message;
	struct sockaddr_in servaddr;
	int n;
	char buff[64];
	if(argc != 2) //处理异常参数
	{
		fputs("usage: ./echo_client message  \n",stderr);
		exit(1);
	}
	message= argv[1];
	printf("message: %s\n",message);
	
	sockfd = socket(AF_INET,SOCK_STREAM,0); 
	
	memset(&servaddr,'\0',sizeof(struct sockaddr_in));
	
	servaddr.sin_family = AF_INET;
	inet_pton(AF_INET,SERVER_IP,&servaddr.sin_addr);
	servaddr.sin_port = htons(SERVER_PORT);
	
	connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
	
	write(sockfd,message,strlen(message));				
	n = read(sockfd,buff,sizeof(buff)-1);
	if(n>0)
	{
		buff[n]='\0';
		printf("receive: %s\n",buff);
	}else
	{
		perror("error!!!");
	}	
	
	printf("finisned.\n");
	close(sockfd);
	return 0;
}

使用gcc编译客户端和服务器端代码:

gcc server.c -o server
gcc client.c -o client

运行客户端和服务端的代码

./server

在这里插入图片描述运行服务端 等待客户端连接

./client “This is a test”

客户端运行成功 成功给服务端发送信息
客户端运行成功

服务器端接收成功 给客户端返回信息
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值