基于c语言的TCP客户端、服务端基础代码
基于c语言的TCP客户端、服务端基础代码
基本流程:
- 客户端:
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/udp.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <unistd.h> /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * tcp客户端(发送) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ int main(int argc, char *argv[]) { int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr; addr.sin_family = AF_INET; // 协议族,是固定的 addr.sin_port = htons(atoi(argv[1])); // 服务器端口,必须转换为网络字节序 addr.sin_addr.s_addr = inet_addr(argv[2]); // 服务器地址 "192.168.64.xxx" connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)); char sendbuff[100]; char recvbuff[100]; while (1) { bzero(sendbuff, 100); scanf("%s",sendbuff); // fgets(sendbuff, 100, stdin); // 向服务端发送数据 write(sockfd, sendbuff, strlen(sendbuff)); //还可以使用send、sendto、sendmsg、 // 接收TCP回弹服务器的消息 printf("收到消息recvbuff = %s\n", recvbuff); bzero(recvbuff, 100); } close(sockfd); return 0; }
- 服务端:
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/udp.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <unistd.h> //TCP服务器代码 ./xxx port /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * tcp服务端(接收) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ int main(int argc, char const *argv[]) { //1.创建TCP套接字 int tcp_socket = socket(AF_INET, SOCK_STREAM, 0); if (tcp_socket == -1) { fprintf(stderr, "tcp socket error,errno:%d,%s\n",errno,strerror(errno)); exit(1); } //2.绑定自身的IP地址和端口 struct sockaddr_in host_addr; host_addr.sin_family = AF_INET; //协议族,是固定的 host_addr.sin_port = htons(atoi(argv[1])); //目标端口,必须转换为网络字节序 host_addr.sin_addr.s_addr = htonl(INADDR_ANY); //目标地址 INADDR_ANY 这个宏是一个整数,所以需要使用htonl转换为网络字节序 bind(tcp_socket,(struct sockaddr *)&host_addr, sizeof(host_addr)); //3.设置监听 队列最大容量是5 listen(tcp_socket,5); //4.等待接受客户端的连接请求 struct sockaddr_in client; socklen_t client_len = sizeof(client); int connect_fd = accept(tcp_socket,(struct sockaddr *)&client,&client_len); //会阻塞 char buf[128] = {0}; //5.说明双方建立连接,此时可以接收数据 while(1) { read(connect_fd,buf,sizeof(buf)); printf("recv from [%s],data is = %s\n", inet_ntoa(client.sin_addr) ,buf); bzero(buf,sizeof(buf)); } return 0; }
-
三次握手示意图:
-
示意图解释:
第一次握手:发送一个SYN标记(请求同步标记)
发送一个序列号seq:x
第二次握手:返回一个SYN标记
返回一个ACK(应答标记,表示我知道了)
返回一个序列号seq:y
返回一个x+1序列号ack(告诉客户端希望下一次数据从+1开始)
第三次握手:发送一个ACK标记
发送一个序列号seq:x+1
发送一个序列号ack:y+1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具