TCP 迭代服务器接受一个客户端的连接,然后处理,完成了这个客户的所有请求后,断开连接。TCP 迭代服务器一次只能处理一个客户端的请求,只有在这个客户的所有请求满足后,服务器才可以继续后面的请求。如果有一个客户端占住服务器不放时,其它的客户机都不能工作了,因此,TCP 服务器一般很少用迭代服务器模型的。
tcp服务器端框架
1.创建tcp套接字
2. 绑定套接字
3. 监听套接字
4. 调用accept()阻塞等待
5. 处理客户端的请求
6. 关闭连接套接字
7. 关闭监听套接字
tcp客户端框架
1.创建tcp套接字
2.调用connect()连接服务器
3.处理服务器端返回的信息
由于客户端不需要固定的端⼜号,因此不必调⽤bind(),客户端的端⼜号由内核⾃动分配。注意, 客户端不是不允许调⽤bind(),只是没有必要调⽤bind()固定⼀个端⼜号,服务器也不是必须调⽤bind(),但如果服务器不调⽤bind(),内核会⾃动给服务器分配监听端⼜,每次启动服务器时端⼜ 号都不⼀样,客户端要连接服务器就会遇到⿇烦。
单进程
server.c
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<errno.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#define _PORT_ 9999
#define _BACKLOG_ 10
int main()
{
int sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
printf("socket()\n");
}
struct sockaddr_in server_socket;
struct sockaddr_in socket;
bzero(&server_socket,sizeof(server_socket));
server_socket.sin_family=AF_INET;
server_socket.sin_addr.s_addr=htonl(INADDR_ANY);
server_socket.sin_port=htons(_PORT_);
if(bind(sock,(struct sockaddr*)&server_socket,sizeof(struct sockaddr_in))<0)
{
printf("bind()\n");
close(sock);
return 1;
}
if(listen(sock,_BACKLOG_)<0)
{
printf("listen()\n");
close(sock);
return 2;
}
printf("success\n");
for(;;)
{
socklen_t len=0;
int client_sock=accept(sock,(struct sockaddr*)&socket,&len);
if(client_sock<0)
{
printf("accept()\n");
return 3;
}
char buf_ip[INET_ADDRSTRLEN];
memset(buf_ip,'\0',sizeof(buf_ip));
inet_ntop(AF_INET,&socket.sin_addr,buf_ip,sizeof(buf_ip));
printf("get connect\n");
while(1)
{
char buf[1024];
memset