目录
前言
今天这个博客只是关于TCP通信的最简单的应用,大家可以敲一下练练手,不懂的函数可以去看看别人的博客。
流程图
图是从这扒拉来的:TCP客户端与服务端_迷途羔羊pro的博客-CSDN博客
服务端
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>
#include <errno.h>
#define SERV_IP "127.0.0.1"
#define SERV_PORT 6000
//TCP server
int main()
{
char server_ip[20] = "";
char server_port[10] = "";
struct sockaddr_in server, my_server;
int sockfd = -1;
int sockfd_ser = -1;
int len;
int ret;
char recv_buf[1024] = "";
//创建套接字,参数一是协议族,参数二是选择使用那个协议
//TCP:SOCK_STREAM
//UDP:SOCK_DGRAM
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
{
printf("###sockfd create failed!!!\n");
goto tcp_error;
}else
printf("###sockfd success, sockfd:%d\n",sockfd);
//绑定
bzero(&server, sizeof(struct sockaddr_in));//清空结构体
server.sin_family = AF_INET;
server.sin_port = htons(SERV_PORT);
server.sin_addr.s_addr = inet_addr(SERV_IP);
//server.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1)
{
printf("###bind failed!!!\n");
goto tcp_error;
}else
printf("###bind success\n");
//监听
if(listen(sockfd, 5) == -1)
{
printf("###listen failed!!!");
}else
printf("###listen success\n");
while(1)
{
sockfd_ser = accept(sockfd, (struct sockaddr *)&my_server, &len);//accept是堵塞函数
printf("###new client connect success ,sockfd is:%d\n",sockfd_ser);
while(1)
{
if(sockfd_ser < 0)
{
printf("###accept failed!!!");
goto tcp_error;
}
ret = recv(sockfd_ser, recv_buf, sizeof(recv_buf), 0);
if(ret > 0 )
{
printf("recv data:%s\n", recv_buf);
}else//当客户端掉线后,recv函数会<0,这时候想让服务端不退出可以在else里面加上break,让它返回大的while循环,继续等待connect连接
{
printf("客户端%d掉线!!!\n", sockfd_ser);
// goto tcp_error;
break;
}
}
}
tcp_error:
sockfd_ser = -1;
sockfd = -1;
close(sockfd);
close(sockfd_ser);
return 0;
}
客户端
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <string.h>
#include <errno.h>
#define CLIENT_PORT 6000
#define CLIENT_IP "127.0.0.1"
//TCP client
int main()
{
printf("this is client\n");
int sockfd = -1;
struct sockaddr_in client_addr;
int len;
int ret = 0;
char send_buf[1024] = "";
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
printf("###sockfd failed!!!");
}
printf("sockfd create success:%d\n", sockfd);
bzero(&client_addr, sizeof(struct sockaddr_in));
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(CLIENT_PORT);
client_addr.sin_addr.s_addr = inet_addr(CLIENT_IP);
if(connect(sockfd, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) == -1)
{
printf("###connect failed!!!");
goto client_error;
}else
printf("connect success\n");
int i = 0;
while(1)
{
printf("请输入你要给服务器的数据(输入end退出客户端):");
scanf("%s", send_buf);
if(!strcasecmp(send_buf, "end"))
{
memset(send_buf, 0 ,sizeof(send_buf));
printf("客户端%d退出\n", sockfd);
sleep(1);
goto client_error;
}
ret = send(sockfd, send_buf, strlen(send_buf), 0);
if(ret < 0)
{
printf("###send failed!!!");
}
}
client_error:
sockfd = -1;
close(sockfd);
return 0;
}
效果:
END!!!