三次握手是在accept之前完成的

server.c


#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

/*
 int socket(int domain, int type, int protocol);
 */

/*
 int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);

 //man 2 bind
 struct sockaddr {
 sa_family_t sa_family;
 char        sa_data[14];
 }

 //man 7 ip
 struct sockaddr_in {
 sa_family_t    sin_family; // address family: AF_INET
 u_int16_t      sin_port;   // port in network byte order
 struct in_addr sin_addr;   // internet address
 };

 //Internet address.
 struct in_addr {
 u_int32_t      s_addr;     //address in network byte order
 };

 */

//int listen(int sockfd, int backlog);
//accept 接受一个新的连接 ,这个新的连接是一个主动套接字
/*   int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
 On success, accept() returns a non-negative integer that is a descriptor for the accepted socket.   On  error,
 -1 is returned, and errno is set appropriately.
 int conn = 0;
 */

/*
 int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen);

 int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
 */

int main()
{	
	int sockfd = 0;
	//创建socket TCP 默认协议
	sockfd = socket(PF_INET, SOCK_STREAM, 0);
	if (sockfd == -1)
	{
		perror("fun socket\n");
		exit(0);
	}
	//TCP/IP 协议的结构体
	struct sockaddr_in srvaddr;
	//地址协议
	srvaddr.sin_family = AF_INET;
	//端口
	srvaddr.sin_port = htons(8001);
	//地址
	srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //127.0.0.1
	//srvaddr.sin_addr.s_addr = INADDR_ANY; //绑定本机的任意一个地址 

	int optval = 1;
	//设置地址复用
	if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval))
			< 0)
	{
		perror("setsockopt bind\n");
		exit(0);
	}
	//绑定
	if (bind(sockfd, (struct sockaddr *) &srvaddr, sizeof(srvaddr)) < 0)
	{
		perror("fun bind\n");
		exit(0);
	}
	//一但调用listen函数,这个套接字sockfd将变成被动套接字;只能接受连接,不能主动的发送连接
	//listen 做了两个队列。。。。。。
	if (listen(sockfd, SOMAXCONN) < 0)
	{
		perror("fun listen\n");
		exit(0);
	}
	pause();

	return 0;
}




client.c

#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

/*
 int socket(int domain, int type, int protocol);
 */

/*
 int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);

 //man 2 bind
 struct sockaddr {
 sa_family_t sa_family;
 char        sa_data[14];
 }

 //man 7 ip
 struct sockaddr_in {
 sa_family_t    sin_family; // address family: AF_INET
 u_int16_t      sin_port;   // port in network byte order
 struct in_addr sin_addr;   // internet address
 };

 //Internet address.
 struct in_addr {
 u_int32_t      s_addr;     //address in network byte order
 };

 */

//int listen(int sockfd, int backlog);
//accept 接受一个新的连接 ,这个新的连接是一个主动套接字
/*   int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
 On success, accept() returns a non-negative integer that is a descriptor for the accepted socket.   On  error,
 -1 is returned, and errno is set appropriately.
 int conn = 0;
 */


int main()
{

	int i = 0;
    //创建多个socket发送信息
	for (i = 0; i < 2; i++)
	{
		int sockfd = 0;
		sockfd = socket(PF_INET, SOCK_STREAM, 0);
		if (sockfd == -1)
		{
			perror("fun socket\n");
			exit(0);
		}

		struct sockaddr_in srvaddr;
		srvaddr.sin_family = AF_INET;
		srvaddr.sin_port = htons(8001);
		srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //127.0.0.1
		//srvaddr.sin_addr.s_addr = INADDR_ANY; //绑定本机的任意一个地址 

		if (connect(sockfd, (struct sockaddr*) (&srvaddr), sizeof(srvaddr)) < 0)
		{
			printf("errno:%d \n", errno);
			perror("fun socket\n");
			exit(0);
		}

	}
	pause();

	return 0;
}


tcp        0      0 127.0.0.1:8001          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:52150         127.0.0.1:8001          ESTABLISHED
tcp        0      0 127.0.0.1:8001          127.0.0.1:52151         ESTABLISHED
tcp        0      0 127.0.0.1:8001          127.0.0.1:52150         ESTABLISHED
tcp        0      0 127.0.0.1:52151         127.0.0.1:8001          ESTABLISHED

可见:三次握手是在accept之前完成的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值