Socket套接字笔记。
1、Socket = IP + Port
2、TCP协议流程
3、头文件
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet.h>
#include<arpa/inet.h>
#include<netdb.h>
4、建立Socket
int socket(int domain, int type, int protocol);
其中:
domain:AF_INET(IPv4)和AF_INET6(IPv6)两个经常用的常数;
type:SOCK_STREAM(TCP)和SOCK_DGRAM(UDP)两个经常使用;
protocol:设为0即可。
作用:建立一个新的Socket,也就是向系统注册,通知系统建立一通信端口。
5、绑定Socket
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
其中:
sockfd:由socket函数返回值所得;
my_addr:由自己声明,然后设置端口和IP以及IPv4(6);
addrlen:使用sizeof(struct sockaddr)即可。
6、监听Socket
int listen(int sockfd, int backlog);
其中:
sockfd:由socket函数返回;
backlog:表示同时能处理最大连接数。
7、接收Socket
int accept(int sockfd, struct sockaddr *addr, int *addrlen);
其中:
sockfd:是由socket函数返回的,并且经过bind、listen函数处理过的;
addr:当连接成功的时候,远程主机的地址数据将会存储到addr中;
addrlen:使用sizeof(struct sockaddr)求解即可。
8、客户端连接服务器
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
其中:
sockfd:是客户端自己另外创建一个和服务端一模一样的sockfd;
serv_addr:自己创建一个sockaddr结构体,填入服务器的信息;
addrlen:使用sizeof(struct sockaddr)求解即可
测试代码:
server.c源码:
扫描二维码关注公众号,回复:
2725758 查看本文章
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
int main()
{
//创建服务器所需要的socket描述符
int fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd == -1)
{
perror("socket");
exit(-1);
}
//第二步:声明装载服务器socket信息的结构体
struct sockaddr_in my_addr;
//清零初始化
memset(&my_addr, 0, sizeof(struct sockaddr));
//bzero(&my_addr, sizeof(struct sockaddr));
//设置IP类型是IPv4
my_addr.sin_family = AF_INET;
//设置监听端口,只要大于1024即可
my_addr.sin_port = htons(8888);
//设置服务器的IP地址,以供客户端连接,一般设置本机IP即可
my_addr.sin_addr.s_addr = inet_addr("172.16.125.149");
//绑定Socket描述符
int ret = bind(fd,(const struct sockaddr *)&my_addr, sizeof(struct sockaddr));
if(ret == -1)
{
perror("bind");
close(fd);
exit(-1);
}
//第三步:监听Socket描述符
ret = listen(fd, 10);
if(ret == -1)
{
perror("listen");
close(fd);
exit(-1);
}
//第四步:声明一个用来装载客户端socket数据的结构体
struct sockaddr_in clientaddr;
//清零初始化
memset(&clientaddr, 0, sizeof(struct sockaddr));
//计算结构体长度
int addrlen = sizeof(struct sockaddr);
//等待客户端的连接,这是一个阻塞方法
int new_fd = accept(fd, (struct sockaddr*)&clientaddr, &addrlen);
if(new_fd == -1)
{
perror("accept");
close(fd);
exit(-1);
}
//如果有客户端成功连接上来,就会打印这句话,并且退出服务器
printf("HHHHHH\n");
exit(0);
}
cliect.c源码:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
int main()
{
//创建可供客户端连接服务器的socket描述符
int fd = socket(AF_INET, SOCK_STREAM, 0);
//检测socket描述符是否有效
if(fd == -1)
{
perror("socket");
exit(-1);
}
//声明一个装载服务器socket信息的结构体
struct sockaddr_in seraddr;
//把结构体内存清零初始化
memset(&seraddr, 0, sizeof(struct sockaddr));
//设置IP类型是IPv4
seraddr.sin_family = AF_INET;
//根据服务器监听的端口,设置数值
seraddr.sin_port = htons(8888);
//根据服务器的IP,设置该值
seraddr.sin_addr.s_addr = inet_addr("172.16.125.149");
//连接服务器
int ret = connect(fd, (struct sockaddr*)&seraddr, sizeof(struct sockaddr));
//检测连接返回值
if(ret== -1)
{
perror("connect");
close(fd);
exit(-1);
}
exit(0);
}