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

  1. 1.服务器端  
  2. #include <sys/types.h>  
  3. #include <sys/socket.h>  
  4. #include <stdio.h>  
  5. #include <stdlib.h>  
  6. #include <errno.h>  
  7. #include <string.h>  
  8. #include <unistd.h>  
  9. #include <netinet/in.h>  
  10. #define SERVPORT 3333  
  11. #define BACKLOG 10  
  12. #define MAX_CONNECTED_NO 10  
  13. #define MAXDATASIZE 5  
  14.   
  15. int main()  
  16. {  
  17.     struct sockaddr_in server_sockaddr,client_sockaddr;  
  18.     int sin_size,recvbytes;  
  19.     int sockfd,client_fd;  
  20.     char buf[MAXDATASIZE];  
  21. /*创建socket*/  
  22.     if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){  
  23.         perror("socket");  
  24.         exit(1);  
  25.     }  
  26.     printf("socket success!,sockfd=%d\n",sockfd);  
  27. /*设置服务器sockaddr_in结构*/  
  28.     server_sockaddr.sin_family=AF_INET;  
  29.     server_sockaddr.sin_port=htons(SERVPORT);  
  30.     server_sockaddr.sin_addr.s_addr=INADDR_ANY;  
  31.     bzero(&(server_sockaddr.sin_zero),8);  
  32. /*绑定socket和端口*/  
  33.     if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1){  
  34.         perror("bind");  
  35.         exit(1);  
  36.     }  
  37.     printf("bind success!\n");  
  38. /*监听客户端请求*/  
  39.     if(listen(sockfd,BACKLOG)==-1){  
  40.         perror("listen");  
  41.         exit(1);  
  42.     }  
  43.     printf("listening....\n");  
  44. /*接受客户端请求*/  
  45.     if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1){  
  46.         perror("accept");  
  47.         exit(1);  
  48.     }  
  49. /*接收客户端信息*/  
  50.     if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1){  
  51.         perror("recv");  
  52.         exit(1);  
  53.     }  
  54.     printf("received a connection :%s\n",buf);  
  55. /*关闭socket*/  
  56.     close(sockfd);  
  57. }  
  58. 2.客户端  
  59. #include <stdio.h>  
  60. #include <stdlib.h>  
  61. #include <errno.h>  
  62. #include <string.h>  
  63. #include <netdb.h>  
  64. #include <sys/types.h>  
  65. #include <netinet/in.h>  
  66. #include <sys/socket.h>  
  67. #define SERVPORT 3333  
  68. #define MAXDATASIZE 100  
  69. main(int argc,char *argv[]){  
  70.     int sockfd,sendbytes;  
  71.     char buf[MAXDATASIZE];  
  72.     struct hostent *host;  
  73.     struct sockaddr_in serv_addr;  
  74. /*argc<2,表示没有输入主机名,主机句是IP地址形式,如“192.168.1.1”*/  
  75.     if(argc < 2){  
  76.         fprintf(stderr,"Please enter the server's hostname!\n");  
  77.         exit(1);  
  78.     }  
  79. /*获取主机名,地址解析函数*/  
  80.     if((host=gethostbyname(argv[1]))==NULL){  
  81.         perror("gethostbyname");  
  82.         exit(1);  
  83.     }  
  84. /*创建socket*/  
  85.     if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){  
  86.         perror("socket");  
  87.         exit(1);  
  88.     }  
  89. /*设置serv_addr结构参数*/  
  90.     serv_addr.sin_family=AF_INET;  
  91.     serv_addr.sin_port=htons(SERVPORT);  
  92.     serv_addr.sin_addr=*((struct in_addr *)host->h_addr);  
  93.     bzero(&(serv_addr.sin_zero),8);  
  94. /*向服务器请求连接,serv_addr是服务器端地址*/  
  95.     if(connect(sockfd,(struct sockaddr *)&serv_addr,\  
  96.         sizeof(struct sockaddr))==-1){  
  97.         perror("connect");  
  98.         exit(1);  
  99.     }  
  100. /*发送消息给服务器,此时可以在服务器端看到"hello"字样*/  
  101.     if((sendbytes=send(sockfd,"hello",5,0))==-1){  
  102.         perror("send");  
  103.         exit(1);  
  104.     }  
  105. /*关闭连接*/  
  106.     close(sockfd);  
  107. }  

二、编译步骤

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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值