一.步骤
TCP服务器
1.建立sock套接字
2.绑定IP和端口号
3.监听
4.等待客户端连接
5接收/发送
二.
第一步:建立sock套接字
使用函数
int socket(int domain, int type, int protocol);
参数:
1.domain:地址族
可选
AF_UNIX, AF_LOCAL
unix(7)本地连接协议
AF_INET
ip(7)IPv4协议
AF_INET6
ipv6(7) IPv6协议
2.type:协议
SOCK_STREAM:流式套接字(TCP)
SOCK_DGRAM: 数据报文套接字(UDP)
SOCK_RAW: 原始套接字 不选用任何协议
3.protocol:参数生效值
默认为:0
指前两个参数生效
int sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0){
perror("socket");
return -1;
}
成功返回 套接字文件描述符
第二步:绑定IP和端口号
在绑定之前先声明声明结构体,并即将给里面成员赋值
//2>绑定IP和端口号*************!
struct sockaddr_in server;//声明结构体,并即将给里面成员赋值
server.sin_family=AF_INET;//表示使用IPv4地址协议
server.sin_port=htons(54321);//端口号 将12345转化为大端序
server.sin_addr.s_addr=inet_addr("192.168.60.5");//IP赋值
使用函数
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
参数:
sockfd:套接字文件描述符
addr:struct sockaddr * 赋值的结构体指针
addrlen:addr的长度
if(bind(sockfd,(struct sockaddr *)&server,sizeof(server))){
perror("bind");
return -1;
}
成功返回0
第三步:监听
使用函数
int listen(int sockfd, int backlog);
sockfd: 文件描述符
backlog:同一时刻被连接的最大值
listen(sockfd,8);//当前这个服务器,同一时刻连接客户端的最大值为8;
第四步:等待客户端连接
使用函数
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数:
sockfd:
addr:客户端的IP
addrlen:addr的长度:
struct sockaddr_in client;//用来保存客户端的IP和端口号
int len=sizeof(client);
int fd;
fd=accept(sockfd,(struct sockaddr *)&client,&len);
if(fd<0){
perror("accept");
return -1;
}
成功返回客户端的fd
第五步:接受客户端消息
使用函数
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数:
sockfd:
addr:客户端的IP
addrlen:addr的长度:
char buf[50];
while(1){
bzero(buf,sizeof(buf));
recv(fd,buf,sizeof(buf),0);
printf("%s\n",buf);
}
此时服务器搭建完成
还需搭建客服端即可联动使用
搭建该服务器所需的头文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>