TCP通信流程:
服务器端:
//TCP通信的服务器端
#include<stdio.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int main(){
//1.创建socket() (用于监听的套接字)
int lfd = socket(AF_INET,SOCK_STREAM,0);//以文件描述符的方式进行返回
if(lfd == -1){
perror("socket");
exit(-1);
}
//2.绑定
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr.s_addr);//IP地址转换,指定服务器端的IP地址
saddr.sin_port = htons(9999);//端口
int ret = bind(lfd,(struct sockaddr *)&saddr,sizeof(saddr));
if(ret == -1){
perror("bind");
exit(-1);
}
//3.监听
ret = listen(lfd,8);
if(ret == -1){
perror("listen");
exit(-1);
}
//接受客户端连接
struct sockaddr_in client_addr;
socklen_t len = sizeof(client_addr);
int cfd = accept(lfd,(struct sockaddr *)&client_addr,&len);
if(cfd == -1){
perror("client");
exit(-1);
}
//输出客户端信息
char clientIP[16];
inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,clientIP,sizeof(clientIP));
unsigned short clientPort = ntohs(client_addr.sin_port);
printf("client ip is : %s,port is %d\n",clientIP,clientPort);
char recvBuf[1024] = {0};
while (1)
{
//开始通信
//获取客户端的数据
int num = read(cfd,recvBuf,sizeof(recvBuf));
if (num == -1)
{
perror("read");
exit(-1);
/* code */
}else if(num > 0){
printf("recv client data : %s\n",recvBuf);
}else if(num == 0){
//表示客户端断开连接
printf("client closed...");
break;
}
//给客户端发送数据
char * data = "hello i am server";
write(cfd,data,strlen(data));
/* code */
}
//关闭文件描述符
close(cfd);
close(lfd);
return 0;
}
客户端
// TCP通信的客户端
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include<stdlib.h>
int main()
{
// 创建套接字
int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd == -1)
{
perror("socket");
exit(-1);
}
// 连接服务器
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr.s_addr);
server_addr.sin_port = htons(9999);
int ret = connect(fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (ret == -1)
{
perror("connect");
exit(-1);
}
char recvBuf[1024] = {0};
while(1)
{
// 通信
// 给客户发送数据
char *data = "hello i am client";
write(fd, data, strlen(data));
sleep(1);
int len = read(fd, recvBuf, sizeof(recvBuf));
if (len == -1)
{
perror("read");
exit(-1);
/* code */
}
else if (len > 0)
{
printf("recv server data : %s\n", recvBuf);
}
else if (len == 0)
{
// 表示服务端断开连接
printf("server closed...");
break;
}
}
// 关闭连接
close(fd);
return 0;
}