1.服务器端
服务端流程步骤
socket函数创建监听套接字lfd
bind函数将监听套接字绑定ip和端口
listen函数设置服务器为被动监听状态,同时创建一条未完成连接队列(没走完tcp三次握手流程的连接),和一条已完成连接队列(已完成tcp三次握手的连接)
accept函数循环的从已完成连接队列中提取连接,并返回一个新的套接字cfd跟客户端进行通信
fork函数创建一个子进程,让子进程与客户端进行通信
子进程:read函数循环的从r缓冲区读取客户端发送的数据,write函数将要发送的数据写入w缓冲区
close函数关闭套接字
2.客户端
客户端流程步骤
-
socket函数创建套接字
-
connect函数连接服务器
-
write函数将要发送的数据写入w缓冲区,read函数从r缓冲区读取服务器发送给客户端的数据
-
close函数关闭套接字
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
int main()
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
exit(1);
}
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family =AF_INET;
saddr.sin_port=htons(6000);
saddr.sin_addr.s_addr=inet_addr("192.168.73.128");
int res =connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
if(res==-1)
{
printf("connect err\n");
exit(1);
}
while(1)
{
printf("input:\n");
char buff[128]={0};
fgets(buff,127,stdin);
if(strncmp(buff,"end",3)==0)
{
break;
}
send(sockfd,buff,strlen(buff)-1,0);
memset(buff,0,128);//清空
recv(sockfd,buff,127,0);
printf("buff=%s\n",buff);
}
close(sockfd);
}
注意:一定要在桥接模式