客户端
流程:
创建套接字–连接服务器–读写操作(请求数据和回应数据)—关闭套接字
#include <stdio.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
//创建套接字,AF_INET是IPV4通信,SOCK_STREAM TCP通信套接字,0代表自动
int sock_fd=socket(AF_INET,SOCK_STREAM,0);
if(sock_fd<0)
{
perror("");
}
//创建IPV4地址结构体,并初始化
struct sockaddr_in server_addr;
server_addr.sin_family =AF_INET;
//将32位主机字节序数据转换成网络字节序数,放到IPV4结构体中的端口选项中
server_addr.sin_port=htons(8080);
//将服务器地址点分十进制转换成32位大端数据
inet_pton(AF_INET,"192.168.0.106",&server_addr.sin_addr.s_addr);
//连接服务器
connect(sock_fd,(struct sockaddr*)&server_addr,sizeof(server_addr));
while(1)
{
char buf[1024]="";
write(sock_fd,"hello",5);
read(sock_fd,buf,sizeof(buf));
printf("buf=%s\n",buf);
}
//关闭套接字
close(sock_fd);
return 0;
}
服务器
流程:
创建套接字–绑定IP–监听–提取–读写操作(请求数据和回应数据)–关闭套接字
#include <stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
int main()
{
//创建套接字
int lfd=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in server_addr;
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(8080);
//绑定服务器IP和端口
inet_pton(AF_INET,"192.168.0.106",&server_addr.sin_addr.s_addr);
int ret=0;
ret=bind(lfd,(struct sockaddr*)&server_addr,sizeof(server_addr));
if(ret<0)
{
perror(" ");
}
//监听
listen(lfd,128);
struct sockaddr_in client_addr;
socklen_t len=sizeof(client_addr);
//提取客户端的套接字并打印客户端的信息
int cfd=accept(lfd,(struct sockaddr*)&client_addr,&len);
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,ip,INET_ADDRSTRLEN);
printf("客户端 IP:%s 端口:%d\n",ip,ntohs(client_addr.sin_port));
//读写操作
while(1)
{
char buf[1024]="";
int n=read(cfd,buf,sizeof(buf));
if(n<0)
{
perror("");
break;
}
else if(n==0)
{
printf("客户端关闭\n");
break;
}else
{
printf("%s\n",buf);
write(cfd,buf,n);
}
}
//关闭套接字
close(lfd);
close(cfd);
return 0;
}