网络编程之socket编程实例

简单实例1

server.c

  1 #include <sys/types.h>
  2 #include <sys/socket.h>                         // 包含套接字函数库
  3 #include <stdio.h>
  4 #include <netinet/in.h>                         // 包含AF_INET相关结构
  5 #include <arpa/inet.h>                      // 包含AF_INET相关操作的函数
  6 #include <unistd.h>
  7 #include<string.h>
  8 #include<stdlib.h>
  9 #include<fcntl.h>
 10 #include<sys/shm.h>
 11
 12 #define PORT    8889
 13 #define MYKEY   12345
 14 #define SIZE    10240
 15
 16 int main()
 17 {
 18     int shmid;
 19     char *shmaddr;                       //定义子进程共用的共享内存
 20     shmid = shmget(MYKEY, SIZE, IPC_CREAT | 0600);
 21     shmaddr= (char *) shmat(shmid, 0, 0);
 22
 23     if(shmid==-1)
 24     {
 25         printf("shmid error\n");
 26     }
 27     memset(shmaddr,0,SIZE);
 28
 29     int i=0;
 30     char buf[100];
 31     memset(buf,0,100);
 32
 33
 34     int server_sockfd,client_sockfd;
 35     int server_len,client_len;
 36
 37     struct sockaddr_in server_sockaddr,client_sockaddr;
 38
 39
 40     server_sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定义套接字类型
 41
 42     server_sockaddr.sin_family=AF_INET;
 43     server_sockaddr.sin_port=htons(PORT);
 44     server_sockaddr.sin_addr.s_addr=INADDR_ANY;
 45
 46     server_len=sizeof(server_sockaddr);
 47
 48     //允许重复使用本地地址和套接字绑定
 49     int j=1;
 50     setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j));
 51
 52     //绑定端口
 53     if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,server_len)==-1)
 54     {
 55         perror("bind:");
 56         exit(1);
 57     }
 58
 59
 60     if(listen(server_sockfd,5)==-1)
 61     {
 62         perror("listen:");
 63         exit(1);
 64     }
 65     printf("Listening...\n");
 66
 67     client_len=sizeof(client_sockaddr);
 68
 69     pid_t ppid,pid;
 70
 71    while(1)
 72    {
 73     if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_sockaddr,&client_len))==-1)
 74         {
 75              perror("accept error:");
 76              exit(1);
 77         }
 78
 79     printf("%s登录服务器\n",inet_ntoa(client_sockaddr.sin_addr));
 80
 81     ppid=fork();
 82
 83     if(ppid==-1)
 84     {
 85         printf("fork 1 failed:");
 86     }
 87
 88     if(ppid==0)                  //子进程用于接收客户端信息并发送
 89     {
 90         pid=fork();
 91         if(pid==-1)
 92         {
 93             printf("fork 2 failed:");
 94             exit(1);
 95         }
 96
 97      int recvbytes;
 98
 99         if(pid==0)              //子子进程用于接收消息
100         {
101             while(1)
102             {
103
104                if((recvbytes=recv(client_sockfd,buf,100,0))==-1)
105                {
106                     perror("read client_sockfd failed:");
107
108                }
109                // printf("recvbytes=%d\n",recvbytes);
110                 usleep(10000);
111                printf("client send buf=%s\n",buf);
112
113                 for(i=0;i<1000;i++)
114                 {
115                     if(*(shmaddr+100*i)==0)
116                     {
117                         strcpy(shmaddr+100*i,buf);
118                         break;
119
120                     }
121                 }
122
123
124             }
125         }
126
127         if(pid>0)               //子进程用于发送消息
128         {
129            while(1)
130             {
131                 if(*(shmaddr+i*100)!=0)
132                {
133                    // strcpy(&buf,shmaddr+100*i);
134
135                   //  buf++;
136                     write(client_sockfd,shmaddr,SIZE);
137                    // send(client_sockfd,buf,strlen(buf),0);
138
139                  //   printf("the server is send buf=%c",buf);
140                   //  printf("send client :%s\n",(shmaddr+i*100)) ;
141                     i++;
142
143                 }
144             }
145
146         }
147
148     }
149
150
151     if(ppid>0)              //总父进程返回等待接收消息
152     {
153         close(client_sockfd);
154     }
155
156
157     }
158
159 }

server.c

client.c

  1 #include <sys/types.h>
  2 #include <sys/socket.h>                         // 包含套接字函数库
  3 #include <stdio.h>
  4 #include <netinet/in.h>                         // 包含AF_INET相关结构
  5 #include <arpa/inet.h>                          // 包含AF_INET相关操作的函数
  6 #include <unistd.h>
  7 #include <string.h>
  8 #include <time.h>
  9
 10 #define  PORT 8889
 11 #define  IP_ADDR "127.0.0.1"
 12
 13 #define SIZE 10240
 14
 15 int main()
 16 {
 17
 18     struct tm *timeptr;
 19     time_t timeval;
 20     char tm[50];
 21     //(void)time(&timeval);
 22     //printf("the date is %s\n",ctime(&timeval));
 23     // printf("The time is %s\n",tm);
 24
 25     int sockfd;                                 // 用于保存客户套接字标识符
 26     int len;                                    // 用于客户消息长度
 27     struct sockaddr_in address;                 // 定义客户套接字地址
 28
 29     int result;
 30
 31
 32     sockfd = socket(AF_INET,SOCK_STREAM, 0);    // 定义套接字类型
 33     address.sin_family = AF_INET;               // 定义套接字地址中的域
 34
 35     address.sin_addr.s_addr = inet_addr(IP_ADDR);    // 定义套接字地址
 36
 37     address.sin_port = htons(PORT);                 // 定义套接字端口
 38     char buf[100];                              // 定义要传送的消息
 39     memset(buf,0,100);
 40     char str[120];                             //存贮输入的语句
 41
 42     char shmaddr[SIZE];                    //接受服务器发送的全部聊天数据
 43     int i=0;
 44
 45     char myname[100];
 46     char say[10]={"[-_-]"};
 47     char blank[10] = {"     "};
 48     printf("欢迎来到聊天室,请输入你的姓名:\n");
 49     scanf("%s",myname);
 50
 51
 52
 53    len = sizeof(address);
 54    result = connect(sockfd, (struct sockaddr *) &address, len); // 请求连接
 55
 56    if (result == -1)
 57     {
 58       perror("Connect failed");
 59       return 1;
 60     }
 61     printf("%s成功登录服务器:\n",myname);
 62
 63
 64     pid_t pid;
 65
 66     pid=fork();
 67     if(pid==-1)
 68     {
 69         printf("fork failed");
 70     }
 71
 72     int sendbytes=0;
 73
 74     if(pid==0)              //子进程用于发送数据
 75     {
 76        while(1)
 77         {
 78                 scanf("%s",str);
 79                 (void)time(&timeval);
 80                 strcpy(tm,ctime(&timeval));
 81
 82                 strcpy(buf,myname);             //姓名传入buf中
 83                 strcat(buf,blank);
 84                 strcat(buf,tm);                 //时间传入buf中
 85                 strcat(buf,say);
 86                 strcat(buf,str);                //语句传入bufz中
 87
 88                  if((sendbytes=write(sockfd, buf, 100))==-1)
 89                  {
 90                     perror("send to server failed:");
 91                  }  // 向服务器传送消息
 92
 93                  usleep(1000);
 94
 95                 memset(buf,0,100);
 96                 memset(tm,0,50);
 97         }
 98     }
 99
100     if(pid>0)               //父进程用于接受消息并读取
101     {
102         while(1)
103         {
104             read(sockfd,shmaddr,SIZE);
105           // printf("server send shmaddr=%s\n",shmaddr);
106
107             if(*(shmaddr+i*100)!=0)
108             {
109                 printf("%s\n",(shmaddr+i*100)) ;
110                 i++;
111                 printf("\n");
112             }
113
114             usleep(1000);
115         }
116
117
118     }
119     close(sockfd);
120     return 0;
121
122
123 }  

client.c

时间: 2024-10-14 06:26:29

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

python网络编程之socket编程

一 客户端/服务器架构 即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) 美好的愿望: 最常用的软件服务器是 Web 服务器.一台机器里放一些网页或 Web 应用程序,然后启动 服务.这样的服务器的任务就是接受客户的请求,把网页发给客户(如用户计算机上的浏览器),然 后等待下一个客户请求.这些服务启动后的目标就是"永远运行下去".虽然它们不可能实现这样的 目标,但只要没有关机或硬件出错等外力干扰,它们就能运行非常长的一段时间. 生活中的C/S架构: 商

网络编程之socket

网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例化需要3个参数: 1.地址簇:socket.AF_INET 2. 流:socket.SOCK_STREAM 3.使用的协议: 默认为0 服务器套接字:以下简称socket_server 客户端套接字:以下简称socket_client 地址:address=('127.0.0.1',8000) so

【转】JAVA网络编程之Socket用法

JAVA网络编程之Socket用法 分类: JAVA2012-08-24 15:56 710人阅读 评论(0) 收藏 举报 在客户/服务器通信模式中,客户端需要主动建立与服务器连接的Socket,服务器端收到客户端的连接请求,也会创建与客户端连接的Socket.Socket可以看做是通信连接两端的收发器,客户端和服务店都通过Socket来收发数据. 1.构造Socket public Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 public Socket(Str

网络编程之UDP编程

网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket代表DatagramSocket发送和接受数据报.值得注意的是:UDP编程必须先由客户端发出信息.一个客户端就是一封信,Socket相当于美国式邮筒(信件的收发都在一个邮筒中).端口与协议相关,所以TCP的30

网络编程之Socket &amp; ServerSocket

网络编程之Socket & ServerSocket Socket:网络套接字,网络插座,建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口:socket用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信. 1.客户端Socket类 此类实现客户端套接字 构造方法 构造方法 作用 Socket(String host, i

Java网络编程之Socket通信(二)

之前在前面已经介绍了Socket通信的一些基本原理,以及如何让客户端与服务器端建立通信,和实现通信的一些基本步骤(包括首先使得服务器端与客户端建立连接,建立连接之后,服务器端开始侦听客户端的请求,侦听到客户端的请求之后,通过输入输出流处理相关信息实现通信,最后通信完毕结束通信等一系列流程). 但是之前只是单个客户端与服务器进行通信,而我们实际应用中单个客户端的情况几乎不存在,都是多个客户端同时与服务器进行交互(这里同时交互就会出现并发性的问题,对于并发性的问题暂时还不是很懂,只知道有这个概念),

网络编程之TCP编程

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

Python网络编程之socket

socket是网络连接端点.例如当你的Web浏览器请求ansheng.me的网站时,你的Web浏览器创建一个socket并命令它去连接ansheng.me的Web服务器主机,Web服务器也对过来的请求在一个socket上进行监听.两端使用各自的socket来发送和接收信息. 在使用的时候,每个socket都被绑定到一个特定的IP地址和端口.IP地址是一个由4个数组成的序列,这4个数均是范围0~255中的值:端口数值的取值范围是0~65535.端口数小于1024的都是为众所周知的网络服务所保留的:

网络编程之socket(转)

“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价 值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好 友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的. 本文的主要内容如下: 1.网络中进程之间如何通信? 2