简单实例1

server.c

 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <sys/socket.h>
 #include <pthread.h>

 int sockfd;//服务器socket
 ];//客户端的socketfd,100个元素,fds[0]~fds[99]
  ;//用来控制进入聊天室的人数为100以内
 char* IP = "0.0.0.0";
 ;
 typedef struct sockaddr SA;

 void init(){
     sockfd = socket(PF_INET,SOCK_STREAM,);
     ){
         perror("创建socket失败");
         exit(-);
     }
     struct sockaddr_in addr;
     addr.sin_family = PF_INET;
     addr.sin_port = htons(PORT);
     addr.sin_addr.s_addr = inet_addr(IP);
     ){
         perror("绑定失败");
         exit(-);
     }
     ) == -){
         perror("设置监听失败");
         exit(-);
     }
 }

 void SendMsgToAll(char* msg){
     int i;
     ;i < size;i++){
         ){
             printf("sendto%d\n",fds[i]);
             send(fds[i],msg,strlen(msg),);
         }
     }
 }

 void* service_thread(void* p){
     int fd = *(int*)p;
     printf("pthread = %d\n",fd);
     ){
         ] = {};
         ) <= ){
             int i;
             ;i < size;i++){
                 if (fd == fds[i]){
                     fds[i] = ;
                     break;
                 }
             }
                 printf("退出:fd = %dquit\n",fd);
                 pthread_exit((void*)i);
         }
         //把服务器接受到的信息发给所有的客户端
         SendMsgToAll(buf);
     }
 }

 void service(){
     printf("服务器启动\n");
     ){
         struct sockaddr_in fromaddr;
         socklen_t len = sizeof(fromaddr);
         int fd = accept(sockfd,(SA*)&fromaddr,&len);
         ){
             printf("客户端连接出错...\n");
             continue;
         }
         ;
         ;i < size;i++){
             ){
                 //记录客户端的socket
                 fds[i] = fd;
                 printf("fd = %d\n",fd);
                 //有客户端连接之后,启动线程给此客户服务
                 pthread_t tid;
                 pthread_create(&tid,,service_thread,&fd);
                 break;
             }
         if (size == i){
             //发送给客户端说聊天室满了
             char* str = "对不起,聊天室已经满了!";
             send(fd,str,strlen(str),);
             close(fd);
         }
         }
     }
 }

 int main(){
     init();
     service();
 }

client.c

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <pthread.h>

 int sockfd;//客户端socket
 char* IP = "192.168.1.105";//服务器的IP
 ;//服务器服务端口
 typedef struct sockaddr SA;
 ];

 void init(){
     sockfd = socket(PF_INET,SOCK_STREAM,);
     struct sockaddr_in addr;
     addr.sin_family = PF_INET;
     addr.sin_port = htons(PORT);
     addr.sin_addr.s_addr = inet_addr(IP);
     ){
         perror("无法连接到服务器");
         exit(-);
     }
     printf("客户端启动成功\n");
 }

 void start(){
     pthread_t id;
     void* recv_thread(void*);
     pthread_create(&id,,recv_thread,);
     ] = {};
     sprintf(buf2,"%s进入了聊天室",name);
     send(sockfd,buf2,strlen(buf2),);
     ){
         ] = {};
         scanf("%s",buf);
         ] = {};
         sprintf(msg,"%s:%s",name,buf);
         send(sockfd,msg,strlen(msg),);
         ){
             memset(buf2,,sizeof(buf2));
             sprintf(buf2,"%s退出了聊天室",name);
             send(sockfd,buf2,strlen(buf2),);
             break;
         }
     }
     close(sockfd);
 }

 void* recv_thread(void* p){
     ){
         ] = {};
         ) <= ){
             return;
         }
         printf("%s\n",buf);
     }
 }

 int main(){
     init();
     printf("请输入您的名字:");
     scanf("%s",name);
     start();
     ;
 }

网络编程之socket编程实例的更多相关文章

  1. 网络编程之Socket代码实例

    网络编程之Socket代码实例 一.基本Socket例子 Server端: # Echo server program import socket HOST = '' # Symbolic name ...

  2. java网络编程之Socket编程

    概念 网络编程分为BIO(传统IO).NIO.AIO.Socket编程属于BIO这种传统IO. InetAddress java.net.InetAddress是JAVA中管理IP地址的类,常用 pu ...

  3. linux网络编程之socket编程(一)

    今天开始,继续来学习linux编程,这次主要是研究下linux下的网络编程,而网络编程中最基本的需从socket编程开始,下面正式开始学习: 什么是socket: 在学习套接口之前,先要回顾一下Tcp ...

  4. linux网络编程之socket编程(八)

    学习socket编程继续,今天要学习的内容如下: 先来简单介绍一下这五种模型分别是哪些,偏理论,有个大致的印象就成,做个对比,因为最终只会研究一个I/O模型,也是经常会用到的, 阻塞I/O: 先用一个 ...

  5. linux网络编程之socket编程(三)

    今天继续对socket编程进行学习,在学习之前,需要回顾一下上一篇中编写的回射客户/服务器程序(http://www.cnblogs.com/webor2006/p/3923254.html),因为今 ...

  6. linux网络编程之socket编程(二)

    今天继续对socket编程进行研究,这里会真正开如用socket写一个小例子,进入正题: TCP客户/服务器模型:   关于这个模型的流程这里就不多说了,比较容易理解,下面则利用这种模型来编写一个实际 ...

  7. linux网络编程之socket编程(十二)

    今天继续学习socket编程,期待的APEC会议终于在京召开了,听说昨晚鸟巢那灯火通明,遍地礼花,有点08年奥运会的架势,有种冲动想去瞅见一下习大大的真容,"伟大的祖国,我爱你~~~&quo ...

  8. linux网络编程之socket编程(十一)

    今天继续学习socket编程,这次主要是学习超时方法的封装,内容如下: ①.alarm[不常用,了解既可] 它的实现思路是这样的: 但是这种方案有一定的问题,因为闹钟可能会作为其它的用途,这时所设置的 ...

  9. linux网络编程之socket编程(十)

    今天继续socket编程的学习,最近晚上睡觉都没有发热,没有暖气的日子还是种煎熬,快乐的十一也已经走来,幸福有暖气的日子也快啦,好了,回到正题~ ①close终止了数据传送的两个方向. ②shutdo ...

随机推荐

  1. 内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]

    前段时间开发的一个后端C模块上线后,线上出core,初始时,因为訪问压力不大,所以崩溃是上线3天左右出现的.当时用gdb跟进调用堆栈并检查源代码,发现出core位置的代码沒有啥问题.因为当时开发任务较 ...

  2. 11.23 Eclipse

    一.Eclipse Workspace File-->Switch Workspace 编译环境:Window -- Preferences – Java - Compiler 运行环境:Win ...

  3. python基础7 ---python函数

    python基础知识 一.闭包函数 1.闭包函数的定义:在一个内部函数中,在对外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包. 2.闭包函数的特点:自带作用域和延迟计算 补 ...

  4. Data Structure Binary Tree: Check if a given Binary Tree is SumTree

    http://www.geeksforgeeks.org/check-if-a-given-binary-tree-is-sumtree/ #include <iostream> #inc ...

  5. web框架详解之 tornado 四 模板引擎、session、验证码、xss

    一.模板引擎 基本使用 继承,extends 页面整体布局用继承 导入,include 如果是小组件等重复的那么就用导入 下面是目录 首先在controllers里面创建一个文件,文件里面是页面类 # ...

  6. Android蓝牙开发浅析【转】

    本文转载自:http://blog.csdn.net/geekdonie/article/details/7487761 由于近期正在开发一个通过蓝牙进行数据传递的模块,在参考了有关资料,并详细阅读了 ...

  7. 《机器学习实战》学习笔记第十一章 —— Apriori算法

    主要内容: 一.关联分析 二.Apriori原理 三.使用Apriori算法生成频繁项集 四.从频繁项集中生成关联规则 一.关联分析 1.关联分析是一种在大规模数据集中寻找有趣关系的任务.这些关系可以 ...

  8. bzoj 3038: 上帝造题的七分钟2 线段树||hdu 4027

    3038: 上帝造题的七分钟2 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1066  Solved: 476[Submit][Status][Dis ...

  9. php发邮件:swiftmailer, php邮件库——swiftmailer

    php发邮件:swiftmailer, php邮件库——swiftmailer 最近看到一个好的php邮件库,与phpmailer作用一样,但性能比phpmailer好,尤其是在处理附件的能力上,发送 ...

  10. Confluence 6 找到未使用的空间

    有时候,你希望找到你系统中没有使用的内容.有时候你也希望能够对这些内容进行更多的关注,但是如何找到一些有关长期不更新的页面,或者长期不使用的空间? View Space Activity 页面中的内容 ...