linux socket实现网络聊天室(一):服务器和客户端对话

来源:互联网 发布:mysql教程 编辑:程序博客网 时间:2024/05/18 03:52

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 5int main(){struct sockaddr_in server_sockaddr,client_sockaddr;int sin_size,recvbytes;int sockfd,client_fd;char buf[MAXDATASIZE];/*创建socket*/if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket");exit(1);}printf("socket success!,sockfd=%d\n",sockfd);/*设置服务器sockaddr_in结构*/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);/*绑定socket和端口*/if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1){perror("bind");exit(1);}printf("bind success!\n");/*监听客户端请求*/if(listen(sockfd,BACKLOG)==-1){perror("listen");exit(1);}printf("listening....\n");/*接受客户端请求*/if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1){perror("accept");exit(1);}/*接收客户端信息*/if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1){perror("recv");exit(1);} printf("received a connection :%s\n",buf);/*关闭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;/*argc<2,表示没有输入主机名,主机句是IP地址形式,如“192.168.1.1”*/if(argc < 2){fprintf(stderr,"Please enter the server's hostname!\n");exit(1);}/*获取主机名,地址解析函数*/if((host=gethostbyname(argv[1]))==NULL){perror("gethostbyname");exit(1);}/*创建socket*/if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket");exit(1);}/*设置serv_addr结构参数*/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);/*向服务器请求连接,serv_addr是服务器端地址*/if(connect(sockfd,(struct sockaddr *)&serv_addr,\sizeof(struct sockaddr))==-1){perror("connect");exit(1);}/*发送消息给服务器,此时可以在服务器端看到"hello"字样*/if((sendbytes=send(sockfd,"hello",5,0))==-1){perror("send");exit(1);}/*关闭连接*/close(sockfd);}

二、编译步骤

#gcc server.c -o server#./server                       //此时服务器端在监听#gcc client.c -o client#./client 172.31.100.236        //客户端向服务器端发送“hello",服务器端监听终止




原创粉丝点击