linux网络通信二(TCP)

TCP通信

流程图如下

1、创建--socket套接字

相同

2、绑定--将创建的socket套接字返回的句柄与本机的ip、端口绑定

相同

3、监听--监听socket

#include<sys/socket.h>

int listen(int s,int backlog);

s--监听的句柄

backlog--监听的最大数,默认20

成功返回0 ,失败返回 -1

4、建立连接--当客户端请求后,调用accept()建立与客户端的连接

#include<sys/socket.h>

int accept(int s,struct sockaddr *addr,socklen_t *addrlen);

accept()函数从连接请求队列中获得连接信息,创建新的套接字,并返回该套接字的文件描述符,客户端与服务器端通过新的套接字通信。最初通过socket创建的套接字扔监听客户端请求。

s -- 监听的套接字句柄

addr -- 服务器的地址结构体

addrlen -- 地址结构体大小

 

成功返回新套接字句柄,失败返回-1

 

5、发送(接收)

#include<sys/socket.h>

#include<sys/types.h>

ssize_t send(int s, const *buf, size_t len,int flags);

s --- accept()返回的新句柄

buf -- 发送数据的缓冲区首地址

len -- buf的大小

成功返回发送的字节数, 失败返回0

 

ssize_t recv(int s,void *buf,size_t len,int flags);

s--accept()返回的新句柄

buf -- 发送数据的缓冲区首地址

len--缓冲区的最大

6、关闭socket

 

7、connect()

#include<sys/types.h>

#include<sys/sockt.h>

int connect(int sockfd, struct sockaddr * serv_sddr, int addr_len);

 

成功返回 0 失败返回-1

代码实例:

//服务器端,echo_server.c
/**
流程:
1、创建--socket套接字
2、绑定--将创建的socket套接字返回的句柄与本机的ip、端口绑定
3、监听--监听socket
4、建立连接--当客户端请求后,调用accept()建立与客户端的连接
5、发送(接收)
6、关闭socket
**/

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<unistd.h>

#define ECHO_PORT 9091
#define MAX_CLIENT_NUM 10

int main()
{
	int sock_fd;
	int count = 1;
	struct sockaddr_in serv_addr;
	struct sockaddr_in client_addr;
	int clientfd;
	int res;
	char buf[101];
	char buf2[]="this is server";
	socklen_t len;
	int n;
	
	//1 socket()
	sock_fd = socket(AF_INET,SOCK_STREAM,0);
	if(sock_fd == -1)
	{
		perror("create socket error\n");
		return 0;
	}
	printf("create socket ok\n");
	
	//2 bind()
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_port=htons(ECHO_PORT);
	serv_addr.sin_addr.s_addr = INADDR_ANY;
	res = bind(sock_fd,(struct sockaddr*) &serv_addr,sizeof(serv_addr));
	
	if (res != 0)
	{
		perror("bind socket error\n");
		close(sock_fd);
		return 0;
	}
	else{
		printf("bind ok\n");
	}
	//3 listen()
	res = listen(sock_fd,MAX_CLIENT_NUM);
	if(res != 0)
	{
		perror("listen socket error\n");
		close(sock_fd);
		return 0;
	}
	else{
		printf("listen ok\n");
	}
	len = sizeof(client_addr);
	while(1)
	{
	//4  accept()
	
	clientfd = accept(sock_fd,(struct sockaddr*) &client_addr,&len);
	
	if(clientfd <= 0)
	{
		perror("accept socket error\n");
		//close(sock_fd);
		//return 0;
		continue;
	}
	else{
		printf("accept ok\n");
	}
	//5 接收
	
		res = recv(clientfd,buf,100,0);
		if(res <= 0)
		{
			close(clientfd);
			continue;
		}
		buf[res]='\0';
		printf("===%d===\nclinet request:%s*\n",count,buf);
		if((strncmp(buf,"quit",4))==0)
		{
			send(clientfd,"exit",4,0);
			break;
		}
		send(clientfd,buf2,sizeof(buf2),0);
		count ++;
		
	}
	
	
	close(clientfd);
	close(sock_fd);
	
	
	return 0;
}
//客户端

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<unistd.h>

#define ECHO_PORT 9091
#define MAX_CLIENT_NUM 10

int main()
{
	int sock_fd;
	int res;
	struct sockaddr_in serv_addr;
	char buf[] ="this is from client";
	//1 socket()
	sock_fd = socket(AF_INET,SOCK_STREAM,0);
	//2 connect()
	
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_port=htons(ECHO_PORT);
	serv_addr.sin_addr.s_addr = INADDR_ANY;
	connect(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) ;
	
	//3 send()
	send(sock_fd,buf,sizeof(buf),0);
	//4recv
	res = recv(sock_fd,buf,100,0);
	
	buf[res]='\0';
	
	printf("server response :%s\n",buf);
	
	close(sock_fd);
	return 0;
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值