C语言实现Socket简单通信
环境是linux,不过应该没什么影响,因为只用到了socket的基本用法,没有涉及pthread等。
分为服务器端和客户端,服务器端监听端口发来的请求,收到后向客户端发送一个Hello World,客户机负责发送消息并打印收到的Hello World.
服务器步骤:建立socket,绑定socket和地址信息,开启监听,收到请求后发送数据。
客户端步骤:建立socket,连接服务器端,接收并打印服务器给的数据。
服务器端代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/shm.h> #define MYPORT 8887 #define QUEUE 20 #define BUFFER_SIZE 1024 int main() { ///定义sockfd int server_sockfd = socket(AF_INET,SOCK_STREAM, 0); ///定义sockaddr_in struct sockaddr_in server_sockaddr; server_sockaddr.sin_family = AF_INET; server_sockaddr.sin_port = htons(MYPORT); server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); ///bind,成功返回0,出错返回-1 if (bind(server_sockfd,( struct sockaddr *)&server_sockaddr, sizeof (server_sockaddr))==-1) { perror ( "bind" ); exit (1); } ///listen,成功返回0,出错返回-1 if (listen(server_sockfd,QUEUE) == -1) { perror ( "listen" ); exit (1); } ///客户端套接字 char buffer[BUFFER_SIZE]; struct sockaddr_in client_addr; socklen_t length = sizeof (client_addr); ///成功返回非负描述字,出错返回-1 int conn = accept(server_sockfd, ( struct sockaddr*)&client_addr, &length); if (conn<0) { perror ( "connect" ); exit (1); } while (1) { memset (buffer,0, sizeof (buffer)); int len = recv(conn, buffer, sizeof (buffer),0); if ( strcmp (buffer, "exit\n" )==0) break ; fputs (buffer, stdout); send(conn, buffer, len, 0); } close(conn); close(server_sockfd); return 0; } |
客户端代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/shm.h> #define MYPORT 8887 #define BUFFER_SIZE 1024 int main() { ///定义sockfd int sock_cli = socket(AF_INET,SOCK_STREAM, 0); ///定义sockaddr_in struct sockaddr_in servaddr; memset (&servaddr, 0, sizeof (servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(MYPORT); ///服务器端口 servaddr.sin_addr.s_addr = inet_addr( "127.0.0.1" ); ///服务器ip ///连接服务器,成功返回0,错误返回-1 if (connect(sock_cli, ( struct sockaddr *)&servaddr, sizeof (servaddr)) < 0) { perror ( "connect" ); exit (1); } char sendbuf[BUFFER_SIZE]; char recvbuf[BUFFER_SIZE]; while ( fgets (sendbuf, sizeof (sendbuf), stdin) != NULL) { send(sock_cli, sendbuf, strlen (sendbuf),0); ///发送 if ( strcmp (sendbuf, "exit\n" )==0) break ; recv(sock_cli, recvbuf, sizeof (recvbuf),0); ///接收 fputs (recvbuf, stdout); memset (sendbuf, 0, sizeof (sendbuf)); memset (recvbuf, 0, sizeof (recvbuf)); } close(sock_cli); return 0; } |
实验结果:
标签:
网络编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架