一、概述
利用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代码
#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] = ' '; cout << "recv:"<<recvbuf<<endl ; } close(socket_fd); return 0; }
2.server代码
#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; }