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

运行结果:

相关推荐
阿明66 分钟前
Linux进程【Linux】
linux·运维·服务器
Android系统攻城狮19 分钟前
Linux Gstreamer深度解析之gst_audio_resampler_update调用流程与实战(三十)
linux·运维·服务器·gstreamer音视频·音视频进阶
qetfw29 分钟前
Linux tcpdump 抓包实战:网卡、主机、端口过滤与 PCAP 分析
linux·tcpdump
pilifeng138 分钟前
Ubuntu Linux 目录结构详解
linux·ubuntu
电棍23344 分钟前
ubuntu网卡失效
linux
律宏阔1 小时前
VMware 能识别 USB 设备,但无法连接(灰色)
linux
Rabitebla1 小时前
【Linux系统编程】指令(三):创建、删除、复制、移动、看内容
linux·数据结构·c++·算法
dog2501 小时前
写一个时延固定的拥塞控制
网络
AR-26710-1 小时前
Linux Day9——复习第一部分(实操产出)
linux
酣大智1 小时前
华为 VRRP的抢占延迟时间
网络·tcp/ip·vrrp