Linux Socket Implementation of a Network Chat Room (Part 1): Server and Client Communication
#Socket#Server#Linux#Chat#Network#Struct
1.服务器端#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <netinet/in.h>#define SERVPORT 3333#define BACKLOG 10#define MAX_CONNECTED_NO 10#define MAXDATASIZE 5 int main(){ struct sockaddr_in server_sockaddr,client_sockaddr; int sin_size,recvbytes; int sockfd,client_fd; char buf[MAXDATASIZE];/* Create socket */ if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){ perror("socket"); exit(1); } printf("socket success!,sockfd=%d\n",sockfd);/* Set up server sockaddr_in structure */ server_sockaddr.sin_family=AF_INET; server_sockaddr.sin_port=htons(SERVPORT); server_sockaddr.sin_addr.s_addr=INADDR_ANY; bzero(&(server_sockaddr.sin_zero),8);/* Bind socket and port */ if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1){ perror("bind"); exit(1); } printf("bind success!\n");/* Listen for client requests */ if(listen(sockfd,BACKLOG)==-1){ perror("listen"); exit(1); } printf("listening....\n");/* Accept client request */ if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1){ perror("accept"); exit(1); }/* Receive client message */ if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1){ perror("recv"); exit(1); } printf("received a connection :%s\n",buf);/* Close socket */ close(sockfd);}2.客户端#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#define SERVPORT 3333#define MAXDATASIZE 100main(int argc,char *argv[]){ int sockfd,sendbytes; char buf[MAXDATASIZE]; struct hostent *host; struct sockaddr_in serv_addr;/* If argc < 2, it means no hostname was entered. The hostname should be in IP address format, e.g., "192.168.1.1" */ if(argc < 2){ fprintf(stderr,"Please enter the server's hostname!\n"); exit(1); }/* Get hostname, address resolution function */ if((host=gethostbyname(argv[1]))==NULL){ perror("gethostbyname"); exit(1); }/* Create socket */ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){ perror("socket"); exit(1); }/* Set serv_addr structure parameters */ serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(SERVPORT); serv_addr.sin_addr=*((struct in_addr *)host->h_addr); bzero(&(serv_addr.sin_zero),8);/* Request connection to the server; serv_addr is the server's address */ if(connect(sockfd,(struct sockaddr *)&serv_addr,\ sizeof(struct sockaddr))==-1){ perror("connect"); exit(1); }/* Send message to the server; "hello" should be visible on the server side */ if((sendbytes=send(sockfd,"hello",5,0))==-1){ perror("send"); exit(1); }/* Close connection */ close(sockfd);}
II. Compilation Steps
#gcc server.c -o server#./server // The server is now listening#gcc client.c -o client#./client 172.31.100.236 // The client sends "hello" to the server, and the server's listening terminates