面向连接的C/S 模型框图
创建一个TCP类型的套接字:
socket() 函数用来创建一个套接字,可以在shell 下输入 “man socket”获得函数原型
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain,int type,int protocol);
参数domain 用于指定创建套接字所使用的协议族,在linux/socket.h中定义,常用的有
- AF_UNIX:创建一个只在本机内进行通信的套接字;
- AF_INET:使用IPV4,TCP/IP协议;
- AD_INET6:使用IPV6,TCP/IP协议;
参数type指定套接字的类型:
- SOCK_STREAM:创建TCP流套接字;
- SOCK_DGRAM:创建UDP数据报套接字;
- SOCK_RAW:创建原始套接字;
参数protocol通常设置为0;
函数的一般实现为:
int socketfd;
socketfd = socket(AF_INET,SOCK_STREAM,0);
if(socketfd < 0){
perror("socket\n");
exit(1);
}
绑定套接字:
函数bind用来将一个套接字和某个端口绑定在一起,函数原型为
#include <sys/types.h>
#include <sys/socket.h>
int bind(int socketfd,struct sockaddr* serv_addr,socklen_t addrlen);
一般的实现方式为:
struct sockaddr_in serv_addr;
memset(serv_addr,0,sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(80);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(socketfd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr_in)) < 0){
perror("bind\n");
exit(1);
}
建立连接:
connect函数原型:
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd,const struct sockaddr* serv_addr,socklen_t addrlen);
实现方式:
struct sockaddr_in serv_addr;
memset(serv_addr,0,sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(80);
if(inet_pton(AF_INET,argv[1],&serv_addr.sin_addr) <0)
{//通过键入的点分十进制IP地址转换到二进制整肃
printf("inet_pton\n");
exit(1);
}
在套接字上监听:
listen 函数原型为:
#include <sys/socket.h>
int listen(int s,int backing);
参数backlog指定了该连接队列的最大长度,如果连接队列已经达到最大,之后的连接请求将被拒绝。
实现方式为:
#define LISTEN_NUM 12
if(listen(socketfd,LISTEN_NUM) < 0){
perror("listen\n");
exit(1);
}
接受连接:
函数accept 用来接受一个连接请求,该函数原型为
#include <sys/types.h>
#include <sys/socket.h>
int accept(int s,struct sockaddr* addr,socklen_t* addrlen);
实现的方式:
int accept_fd;
accept_fd = accept(socketfd,(struct sockaddr*)NULL,NULL);
if(accept_fd < 0){
printf("accept\n");
exit(1);
}
发送数据:
send函数原型为:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int s,const void* msg,size_t len,int flags);
send函数只能在建立连接的套接字使用,参数int s 为accept 函数的返回值; len 为发送数据的长度;flag 默认为0;
实现方式:
char sendbuff[1024];
if(send(accept_fd,sendbuff,len,0) < 0){
printf("send\n");
exit(1);
}
接受数据:
recv函数原型:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int s,void* buf,size_t len,int flags);
实现方式:
char recv[1024];
if(recv(accept_fd,recv,len,0) < 0){
printf("send\n");
exit(1);
}
错误代码都会存入 errno中,可以strerror(errno) 查看