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

目录

1.编程流程

2.代码演示

2.1 服务器代码

 2.2 客户端代码

3.注意

3.1 ping命令

3.2 netstat命令

3.3 为什么memset?

3.4 哪个会阻塞?

3.5 显示连接信息


1.概念

1.1 编程流程

1.2 connect与listen

connect方法执行后,会进行三次握手,建立连接。

listen的第二个参数的含义?

已完成三次握手的等待队列的长度 

2.代码演示

2.1 服务器代码

#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 客户端代码

#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之前加一句代码:

printf("accept wait...\n");

3.5 显示连接信息

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

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

 运行结果:

相关推荐

  1. Linux网络编程 SQLite库(TCP Socket 服务器 客户

    2024-03-12 05:20:01       53 阅读
  2. 本地socket通信服务器客户

    2024-03-12 05:20:01       43 阅读
  3. Qt tcp通信客户+服务器一对一)

    2024-03-12 05:20:01       34 阅读
  4. 创建socket服务客户--通信(简单入门)

    2024-03-12 05:20:01       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-12 05:20:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-12 05:20:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-12 05:20:01       82 阅读
  4. Python语言-面向对象

    2024-03-12 05:20:01       91 阅读

热门阅读

  1. 详解vue3的组件 v-model

    2024-03-12 05:20:01       39 阅读
  2. 第三章 多线程与多进程

    2024-03-12 05:20:01       35 阅读
  3. 剑指offer面试题31:栈的压入、弹出序列

    2024-03-12 05:20:01       34 阅读
  4. 【lv15 day9 原子变量和自旋锁的应用】

    2024-03-12 05:20:01       39 阅读
  5. 使用docker搭建squoosh

    2024-03-12 05:20:01       38 阅读
  6. 如何防范企业内部安全威胁?

    2024-03-12 05:20:01       32 阅读
  7. Minio docker容器化部署配置详情

    2024-03-12 05:20:01       41 阅读
  8. 二叉树的层序遍历

    2024-03-12 05:20:01       42 阅读
  9. 服务器访问慢怎么办

    2024-03-12 05:20:01       38 阅读
  10. 【力扣100】198.打家劫舍

    2024-03-12 05:20:01       39 阅读