UNIX网络编程——TCP协议API 基础demo服务器代码

        

目录

一.TCP客户端API

1.创建套接字

2.connect连接服务器​编辑

 3.send发送信息

 4.recv接受信息

 5.close

 二.TCP服务器API

1.socket创建tcp套接字(监听套接字)

2.bind给服务器套接字绑定port,ip地址信息

3.listen监听并创建连接队列

4.accept提取客户端的连接

5.send,recv

​编辑

6.close

实例:基于TCP客户端与服务器的实现与代码联调

一.TCP客户端API

1.创建套接字

2.connect连接服务器

 3.send发送信息

 4.recv接受信息

 5.close

 二.TCP服务器API

1.socket创建tcp套接字(监听套接字)

2.bind给服务器套接字绑定port,ip地址信息

3.listen监听并创建连接队列

4.accept提取客户端的连接

5.send,recv

6.close

close(套接字)会导致对方recv收到0长度报文

实例:基于TCP客户端与服务器的实现与代码联调

#include <cstdio>
#include<iostream>
#include<string.h>     //memset
#include<arpa/inet.h>  //htos
#include<sys/socket.h>  //socket
#include<netinet/in.h> //struct sockaddr
#include<unistd.h>  //close
#include<sys/wait.h>
 
void ser() //服务端
{
	//第一步建立套接字
	int ser_sk = socket(PF_INET, SOCK_STREAM, 0); 

	//第二步建立地址信息,并用bind进行绑定
	struct sockaddr_in ser_add ;				   //建立服务端套接字地址结构
	memset(&ser_add, 0, sizeof ser_add);          
	ser_add.sin_family = AF_INET;				   //填写对应的port,ip,协议族
	ser_add.sin_port = htons(9100);
	ser_add.sin_addr.s_addr = htonl(INADDR_ANY);   //记得转换为网络字节序
	bind(ser_sk,(struct sockaddr *)&ser_add,sizeof ser_add);  //绑定IP,port


	//第三步监听套接字,创建连接队列
	listen(ser_sk, 5);  

	//第四步进行accpet连接通信
	struct sockaddr_in cli_add;
	socklen_t cli_len = sizeof cli_add;
	sleep(1);
	int cli_sk = accept(ser_sk,(struct sockaddr *)&cli_add , &cli_len);  //建立连接,获得通信套接字,和对方套接字信息
	
	//接受信息
	unsigned char buffer[1500] = "";
	char ip[16] = "";
	unsigned short port = 0;

	inet_ntop(AF_INET, &cli_add.sin_addr.s_addr,ip,16); //把32为ip地址转化为字符串
	port = ntohs(cli_add.sin_port);  //网络字节序转化为主机字节序


	printf("客户端:%s %d  connnected\n",ip,port);
	int len = recv(cli_sk, buffer, sizeof buffer , 0);   //接受信息
	printf("%s\n", buffer);
	close(ser_sk);
}


void cli()    //客户端
{
	//第一步:建立套接字
	int cli_sk = socket(PF_INET, SOCK_STREAM, 0);  //建立客户端套接字

	//第二步建立发送到的地址结构
	struct sockaddr_in ser_add;		
	memset(&ser_add, 0, sizeof ser_add);
	
	ser_add.sin_family = AF_INET; 
	ser_add.sin_addr.s_addr = inet_addr("127.0.0.1");
	ser_add.sin_port = htons(9100);

	//第三步骤建立连接,给客户端分配端口
	connect(cli_sk, (struct sockaddr*)&ser_add, sizeof ser_add);  

	//第四步发送信息
	const char* buffer = "hello world";
	send(cli_sk, buffer, 11, 0);  

	close(cli_sk);
}

void pra() {

	pid_t pid = fork();
	if (pid == 0)
	{
		sleep(1);
		//开启客户端
		cli();
		
	}
	else if(pid > 0){
		//开启服务端
		ser();
		int status = 0;
		wait(&status);
	}

}

int main() {

	pra();
	return 0;
}

 运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值