TCP服务器的模型
1>建立socket连接(产生socket套接字)
头文件: #include <sys/types.h>
#include <sys/socket.h>
函数: int socket(int domain, int type, int protocol);
功能:
建立socket连接
参数:
domain:协议
AF_UNIX, AF_LOCAL Local communication unix(7) 地址族
本地连接协议 域通信
AF_INET IPv4 Internet protocols ip(7)
IPv4协议
AF_INET6 IPv6 Internet protocols ipv6(7)
IPv6协议
type:类型
SOCK_STREAM:流式套接字 (TCP)
SOCK_DGRAM:数据报文套接字 (UDP)
SOCK_RAW:原始套接字
protocol:0,前面的配置可用
返回值:
成功返回套接字文件描述符
失败返回-1,并返回错误码
使用:int sockfd = socket(AF_INET,SOCK_STREAM,0);
2>绑定IP和端口号
头文件: #include <sys/types.h>
#include <sys/socket.h>
函数 int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:
绑定IP和端口号
参数:
sockfd:socket返回的文件描述符
addr:sockaddr *addr
addrlen:addr的长度
返回值:
成功返回0
失败返回-1,并返回错误码
使用:
struct sockaddr_in server;
server.sin_fimaly = AF_INET;-----IPv4
server.sin_port = htons(12345);------端口号,在范围内自己
server.sin_addr.s_addr = inet_addr("192.168.50.120");----服务器的IP
bind(sockfd,(struct sockaddr *)&server,sizeof(server));
3>监听
#include <sys/types.h>
#include <sys/socket.h>
int listen(int sockfd, int backlog);
功能:
监听,将主动连接变成被动连接
参数:
sockfd:socket返回的文件描述符
backlog:同一瞬间允许同时连接的客户端数量
返回值:
成功返回0
失败返回-1,并返回错误码
使用:
listen(sockfd,30);
4>等待连接
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
阻塞等待客户端连接
参数:
sockfd:socket返回的文件描述符
addr:struct sockaddr * -->用来保存客户端的IP和端口
addrlen:addr的长度
返回值:
成功返回非负的文件描述符
失败返回-1,并返回错误码
使用;
struct sockaddr_in client;
client.sin_fimaly = AF_INET;-----IPv4
client.sin_port = htons(12345);------端口号,在范围内自己
client.sin_addr.s_addr = inet_addr("192.168.50.120");----服务器的IP
int len = sizeof(client);
int fd = accept(sockfd,(struct sockaddr *)&client,len);
5>接收recv
char buf[128];
int ret;
while(1){
bzero(buf,sizeof(buf));
ret = recv(fd,buf,sizeof(buf),0);
if(ret > 0){
printf("buf:%s",buf);
}
}
线程:发送send
pthread_t thread;
pthread_create(&thread,NULL,func,&fd);
void *func(void *arg){
int fd = *(int *)arg;
char buf[128];
while(1){
bzero(buf,sizeof(buf));
fgets(buf,stdin);
send(fd,buf,sizeof(buf),0);
}
}
TCP客户端的模型
1>建立socket连接(产生socket套接字)
头文件: #include <sys/types.h>
#include <sys/socket.h>
函数: int socket(int domain, int type, int protocol);
功能:
建立socket连接
参数:
domain:协议
AF_UNIX, AF_LOCAL Local communication unix(7) 地址族
本地连接协议 域通信
AF_INET IPv4 Internet protocols ip(7)
IPv4协议
AF_INET6 IPv6 Internet protocols ipv6(7)
IPv6协议
type:类型
SOCK_STREAM:流式套接字 (TCP)
SOCK_DGRAM:数据报文套接字 (UDP)
SOCK_RAW:原始套接字
protocol:0,前面的配置可用
返回值:
成功返回套接字文件描述符
失败返回-1,并返回错误码
使用:int sockfd = socket(AF_INET,SOCK_STREAM,0);
2>写入IP和端口号
struct sockaddr_in server;
server.sin_fimaly = AF_INET;-----IPv4
server.sin_port = htons(12345);------端口号,在范围内自己
server.sin_addr.s_addr = inet_addr("192.168.50.120");----服务器的IP
bind(sockfd,(struct sockaddr *)&server,sizeof(server));
3>连接
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:
连接服务器
参数:
sockfd:socket返回的文件描述符
sockaddr *addr:保存服务器的IP和端口号
addrlen:addr的长度
返回值:
成功返回0
失败返回-1,并返回错误码
使用;
connect(sockfd,(struct sockaddr *)&server,sizeof(server));
4>发送send
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
发送数据
参数:
sockfd:socket返回的文件描述符
buf:数据存放的地方
len:buf的长度
flags: 0
返回值:
成功返回发送的字节数
失败返回-1,并返回错误码
使用:
char buf[128];
while(1){
bzero(buf,sizeof(buf));
fgets(buf,stdin);
send(sockfd,buf,sizeof(buf),0);
}
线程:接收recv
pthread_t thread;
pthread_create(&thread,NULL,func,&sokfd);
void *func(void *arg){
int sockfd = *(int *)arg;
char buf[128];
while(1){
bzero(buf,sizeof(buf));
recv(sockfd,buf,sizeof(buf),0);
}
}