套接字编程基本框架

client.c文件

 1 #include<sys/socket.h>
 2 #include<sys/types.h>
 3 #include<stdio.h>
 4 #include<netinet/in.h>
 5 #include<arpa/inet.h>
 6 #include<errno.h>
 7 #include<string.h>
 8 #include<stdlib.h>
 9 #include<unistd.h>
10 int main()
11 {
12 //int socket(int domain, int type, int protocol);
13     int sockfd;
14     sockfd=socket(AF_INET,SOCK_STREAM,0);
15     printf("sockfd=%d\n",sockfd);
16 
17 /*
18    int  connect(int sockfd, struct sockaddr *serv_addr, int addrlen );
19     作用:向服务器请求三次握手
20     参数1:套接字
21     参数2:服务端的地址族结构,也就是地址类型,IP,端口
22     参数3:服务端地址族的大小
23     返回值:成功则返回非负数
24  */
25    struct sockaddr_in seraddr;
26     seraddr.sin_family=AF_INET;
27     seraddr.sin_port=htons(7319);
28     inet_pton(AF_INET,"192.168.6.11",&seraddr.sin_addr.s_addr);
29 
30     int ret=connect(sockfd,(struct sockaddr *)&seraddr,sizeof(seraddr));
31     if(ret<0)
32         perror("connect failed:");
33         exit(0);
34     }
35 
36     char buf[20];
37     scanf("%s",buf);
38     write(sockfd,buf,strlen(buf)+1);
39     close(sockfd);
40 
41     return 0;

server.c文件

 1 #include<sys/socket.h>
 2 #include<sys/types.h>
 3 #include<stdio.h>
 4 #include<netinet/in.h>
 5 #include<arpa/inet.h>
 6 #include<errno.h>
 7 #include<string.h>
 8 #include<stdlib.h>
 9 #include<unistd.h>
10 int main()
11 {
12     /*
13        int socket(int domain, int type, int protocol);
14     作用:创建套接字。在服务器,该套接字用于监听
15     参数1:使用的协议如IPv4用 AF_INET
16     参数2:使用的协议的类型,type指定协议类型,SOCK_STREAM指定字节流协议(如TCP),SOCK_DGRAM指定数据报协议(如UDP),
17     参数3:具体的协议,这里填NULL.
18     返回值:返回套接字文件描述符
19      */
20 
21     int listenfd;
22 
23     listenfd=socket(AF_INET,SOCK_STREAM,0);
24     printf("listenfd=%d\n",listenfd);
25 
26     /*
27        int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
28        作用:将用于监听的套接字与服务器的端口已经IP进行捆绑。
29        第一个参数: 用于监听的套接字。
30        第二个参数:服务器的IP,端口,已经协议的类型。这里使用的是通用的地址协
31 议族,使用的时候,需要将我们的IPv4地址协议族转换成通用的地址协议族
32        第三个参数:地址族占用的空间的大小
33      */
34      struct sockaddr_in myaddr;
35     myaddr.sin_family=AF_INET;
36     myaddr.sin_port=htons(7319);
37     inet_pton(AF_INET,"192.168.6.11",&myaddr.sin_addr.s_addr);
38 
39     int ret=bind(listenfd,(struct sockaddr *)&myaddr,sizeof(myaddr));
40     if(ret<0)
41     {
42         perror("bind failed:");
43         exit(0);
44     }
45     /*
46        int listen(int sockfd, int backlog);
47        作用:用于监听绑定的套接字是否有人请求三次握手。
48        第一个参数:bind之后的套接字
49        第二个参数:同一时间允许等待队列的大小
50        返回值:成功则返回非负数
51      */
52      ret=listen(listenfd,20);
53     if(ret<0)
54     {
55         perror("listen failed:");
56         exit(0);
57     }
58    /*
59       int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
60        作用:接收三次握手,建立端对端的链接
61        参数1:用于监听的套接字
62        参数2:用于接收客户端的地址族结构。
63        参数3:客户端地址族的大小的地址
64        返回值:链接之后的套接字,这个套接字就是负责和客户端进行数据传输
65     */
66    struct sockaddr_in caddr;
67    int len=sizeof(caddr);
68    int confd;
69 
70    while(1)
71    {
72        confd=accept(listenfd,(struct sockaddr*)&caddr,&len);
73        if(confd<0)
74        {
75            perror("accept failed:");
76            exit(0);
77        }
78 
79        char buf[100];
80 
81        ret=read(confd,buf,100);
82        if(ret<0)
83        {
84            perror("read failed:");
85            exit(0);
86        }
87        else if(ret==0)
88        {
89 
90         else
91         {
92             printf("ret=%d buf=%s\n",ret,buf);
93         }
94     }
95 }

 

posted @ 2017-10-18 15:10  时光淡了旧人心  阅读(339)  评论(0编辑  收藏  举报