tcp服务器客户端通信(socket编程)

目录

1.编程流程

2.代码演示

[2.1 服务器代码](#2.1 服务器代码)

[2.2 客户端代码](#2.2 客户端代码)

3.注意

[3.1 ping命令](#3.1 ping命令)

[3.2 netstat命令](#3.2 netstat命令)

[3.3 为什么memset?](#3.3 为什么memset?)

[3.4 哪个会阻塞?](#3.4 哪个会阻塞?)

[3.5 显示连接信息](#3.5 显示连接信息)


1.编程流程

2.代码演示

2.1 服务器代码

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{
	int sockfd=socket(AF_INET,SOCK_STREAM,0);//监听套接字
	assert(sockfd!=-1);

	struct sockaddr_in saddr,caddr;
	memset(&saddr,0,sizeof(saddr));
	saddr.sin_family=AF_INET;
	saddr.sin_port=htons(6000);//主机,网络大小端转换
	saddr.sin_addr.s_addr=inet_addr("127.0.0.1");//IP地址转换
	
	int res=bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
	assert(res!=-1);

	res=listen(sockfd,5);
	assert(res!=-1);
	
	while(1)
	{
		int len=sizeof(saddr);
		int c=accept(sockfd,(struct sockaddr*)&caddr,&len);//链接套接字
		if(c<0)
		{
			continue;
		}
		printf("accept c=%d\n",c);

		char buff[128]={0};
		recv(c,buff,127,0);
		printf("buff=%s\n",buff);

		send(c,"ok",2,0);
		close(c);
	}
	close(sockfd);
	exit(0);
}

2.2 客户端代码

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{
	int sockfd=socket(AF_INET,SOCK_STREAM,0);//监听套接字
	assert(sockfd!=-1);

	struct sockaddr_in saddr;
	memset(&saddr,0,sizeof(saddr));
	saddr.sin_family=AF_INET;
	saddr.sin_port=htons(6000);
	saddr.sin_addr.s_addr=inet_addr("127.0.0.1");

	int res=connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
	assert(res!=-1);

	printf("input:\n");
	char buff[128]={0};
	fgets(buff,127,stdin);
	send(sockfd,buff,strlen(buff),0);
	memset(buff,0,128);
	recv(sockfd,buff,127,0);
	printf("read:%s\n",buff);

	close(sockfd);
	exit(0);
}

运行结果:

3.注意

3.1 ping命令

如果出错了,可以使用ping命令

ping主要用来测试两个主机之间的连通性

3.2 netstat命令

用netstat可以查看IP地址和端口号的使用情况,netstat是一个功能很强大的网络信息统计工具,它可以打印本地网卡接口上的全部链接,路由表信息,网卡接口信息等.

网络编程我们主要用的就是,显示TCP连接及其状态信息

运行服务器代码再执行netstat命令:

运行服务器和客户端代码再执行netstat命令:

3.3 为什么memset?

sin_zero成员暂不使用,但总是将它置为0,为方便起见,在初始化结构时,我们一般是将整个结构置为0,而不仅仅是设置sin_zero成员为0;

3.4 哪个会阻塞?

listen不会阻塞;

accept会阻塞,如果已完成三次握手的队列为空,就是没有客户端和服务器连接,那么就无法处理接受连接客户端,就会阻塞在这里:

比如演示accept阻塞的情况,我们在accept之前加一句代码:

cpp 复制代码
printf("accept wait...\n");

3.5 显示连接信息

要显示客户端的IP地址和端口:

cpp 复制代码
printf("accept client ip:%s ,port=%d\n",inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));

运行结果:

相关推荐
anddddoooo3 小时前
域内证书维权
服务器·网络·网络协议·安全·网络安全·https·ssl
Long._.L3 小时前
OpenSSL实验
网络·密码学
Dyan_csdn3 小时前
【Python项目】基于Python的Web漏洞挖掘系统
网络·python·安全·web安全
lllsure4 小时前
Linux 实用指令
linux·物联网
努力的小T4 小时前
使用 Docker 部署 Apache Spark 集群教程
linux·运维·服务器·docker·容器·spark·云计算
okok__TXF4 小时前
Rpc导读
网络·网络协议·rpc
Nerd Nirvana4 小时前
OpenSSL crt & key (生成一套用于TLS双向认证的证书密钥)
linux·ssl·shell·认证·加密·tls·oepnssl
&向上5 小时前
RK3588配置成为路由器
网络·智能路由器·rk3588
letisgo55 小时前
记录一次部署PC端网址全过程
linux·阿里云·服务器运维