使用C编写一个简单的Socket聊天,有Server端和Client端
一、概述
利用C写一个客户端服务器模式的简单的Socket网络通讯服务,此服务特别简单:只需要一个Server对应一个Client的聊天,不支持多个Client和Server聊天,聊天模式也比较简单,就是发什么会回复什么。
1.Server.cpp的创建步骤
a.创建socket
b.设置参数setsockopt
c.绑定bind
d.监听listen
e.接收客户端发送过来的消息accept
f.给客户端回复消息send
g.关闭链接 close
2.Client端的创建步骤
a.创建socket
b.连接服务端 connect
c.给服务端发送消息 send
d.接收来自服务端的消息recv
f.关闭socket
3.执行成功后手动编译或者放工具编辑都可。在client终端输入要发送的内容,在终端就会显示发送内容以及服务端回复的内容。
二、代码示例
1.client代码
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 | #include <iostream> #include <sys/socket.h> #include <sys/types.h> #include <string.h> #include <stdlib.h> #include <netinet/in.h> #include <unistd.h> #include <arpa/inet.h> #define MESSAGE_LEN 1024 #define PORT 8888 using namespace std; int main( int argc, char const *argv[]) { /* code */ //创建socket int socket_fd; int ret=- 1 ; struct sockaddr_in serveraddr; char sendbuf[MESSAGE_LEN] = { 0 ,}; char recvbuf[MESSAGE_LEN] = { 0 ,}; socket_fd = socket(AF_INET,SOCK_STREAM, 0 ); if (socket_fd==- 1 ){ cout << "" <<endl; exit(- 1 ); } serveraddr.sin_family = AF_INET; serveraddr.sin_port = PORT; serveraddr.sin_addr.s_addr = inet_addr( "127.0.0.1" ); ret = connect(socket_fd,(struct sockaddr *)&serveraddr,sizeof(serveraddr)); if (ret< 0 ){ cout<< "Failed to connect server!" <<endl; exit(- 1 ); } while ( 1 ){ memset(sendbuf, 0 ,MESSAGE_LEN); gets(sendbuf); ret = send(socket_fd,sendbuf,strlen(sendbuf), 0 ); if (ret<= 0 ){ cout<< "Failed tosend data!" <<endl; break ; } if (strcmp(sendbuf, "quit" )== 0 ){ break ; } ret = recv(socket_fd,recvbuf,MESSAGE_LEN, 0 ); recvbuf[ret] = '\0' ; cout << "recv:" <<recvbuf<<endl ; } close(socket_fd); return 0 ; } |
2.server代码
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 67 68 69 70 71 72 | #include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #define PORT 8888 #define MESSAGE_LEN 1024 int main( int argc, char const *argv[]) { int socket_fd,accept_fd; int on= 1 ; int ret =- 1 ; int backlog = 10 ; struct sockaddr_in localaddr ,remoteaddr; socket_fd = socket(AF_INET,SOCK_STREAM, 0 ); char in_buff[MESSAGE_LEN] = { 0 }; //如果socket创建失败就退出 if (socket_fd==- 1 ){ std::cout<< "Failed to create socket!" <<std::endl; exit(- 1 ); } ret = setsockopt( socket_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); if (ret==- 1 ){ std::cout<< "Failed 通setsocket options!" <<std::endl; exit(- 1 ); } localaddr.sin_family=AF_INET; localaddr.sin_port = PORT; localaddr.sin_addr.s_addr = INADDR_ANY; bzero(&(localaddr.sin_zero), 8 ); ret = bind(socket_fd, (struct sockaddr*)&localaddr,sizeof(struct sockaddr)); if (ret ==- 1 ){ std::cout<< "Failed to bind addr!" <<std::endl; exit(- 1 ); } ret = listen(socket_fd,backlog); if (ret==- 1 ){ std::cout<< "Failed to bind listen socket!" <<std::endl; exit(- 1 ); } for (;;){ socklen_t addr_len = sizeof(struct sockaddr); accept_fd = accept(socket_fd,(struct sockaddr*)&remoteaddr,&addr_len); for (;;){ ret=recv(accept_fd,( void *)in_buff,MESSAGE_LEN, 0 ); if (ret== 0 ){ break ; } std::cout << "recv:" << in_buff<<std::endl; send(accept_fd,( void *)in_buff,MESSAGE_LEN, 0 ); } close(accept_fd); } close(socket_fd); return 0 ; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探