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));

运行结果:

相关推荐
Sheffield18 分钟前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield8 小时前
Alpine是什么,为什么是Docker首选?
linux·docker·容器
Johny_Zhao1 天前
centos7安装部署openclaw
linux·人工智能·信息安全·云计算·yum源·系统运维·openclaw
haibindev1 天前
在 Windows+WSL2 上部署 OpenClaw AI员工的实践与踩坑
linux·wsl2·openclaw
0xDevNull2 天前
Linux切换JDK版本详细教程
linux
进击的丸子2 天前
虹软人脸服务器版SDK(Linux/ARM Pro)多线程调用及性能优化
linux·数据库·后端
Johny_Zhao4 天前
OpenClaw安装部署教程
linux·人工智能·ai·云计算·系统运维·openclaw
chlk1235 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑5 天前
Ubuntu系统安装CodeX出现问题
linux·后端