Socket编程上篇-----服务器监听与连接

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)两个经常用的常数;
    typeSOCK_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函数返回的,并且经过bindlisten函数处理过的;
    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源码:

#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);
}

猜你喜欢

转载自blog.csdn.net/qq_36006553/article/details/74905793