Linux C 套接字socket TCP(1)

来源:互联网 发布:nginx conf配置详解 编辑:程序博客网 时间:2024/06/06 10:49




1、创建套接字

          例:int sockfd;          sockfd = socket(AF_INET, SOCK_STREAM, 0);  

          socket () 函数:

                                         int socket(int domain, int type, int protocol)

                 //参数domain;设置网络通信的域,即选择通信协议族。AF_INET为IPv4
                //参数type:设置套接字通信的类型,主要有SOCK_STREAM(流式套接字,TCP连接)、SOCK_DGRAM(数据包套接字,UDP连接)
               //参数protocol:制定type协议类型中的某个特定类型。通常某协议中只有一种特定类型,即protocol参数仅能设为0
              //创建 套接字

2、结构体  struct sockaddr_in                        //库 <netinet/in.h>

                               //short int sin_family; 协议族,在socket编程中 只能是AF_INET
                              //unsigned short int sin_port;  端口号,使用网络字节顺序
                             //struct in_addr sin_addr; 含unsigned long s_addr; 存储IP地址
                            //unsigned char sin_zero[8];

               例:

                         struct sockaddr_in servAddr;

                         bzero(&servAddr, sizeof(servAddr));     //初始化 servAddr变量
                         servAddr.sin_family = AF_INET;
                         servAddr.sin_port = htons(8888);
                         servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

 3、客户端 连接 、 读取

            例:

               connect(sockfd, (struct sockaddr *)&servAddr, sizeof(servAddr));        //连接 套接字 和 IP
               int rcvLen;                                     rcvLen = read(sockfd, rcvbuf, 128);     //读取 信息

4、函数 setsockopt()             //设置套接字属性

                         //int setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen);
                               //参数s;套接字,指向一个打开的套接口描述符
                              //参数level:级别,SOL_SOCKET(基本套接口)
                             //参数optname:选项名,SO_REUSEADDR(允许套接口和已使用的地址捆绑)
                            //参数optval:选项值,
                           //参数optlen:选项长度,
                 例:

                       setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));        //设置套接字属性
5、服务端 绑定、监听、写入

               例:
                     bind(sockfd, (struct sockaddr *)&serAddr, sizeof(struct sockaddr));     //绑定 套接字 和 IP、端口
                     listen(sockfd, 2);      //设置 可同时监听的最大数量
                     listenfd = accept(sockfd, (struct sockaddr *)&cliAddr,&len);  

                     write(sockfd,"test",5);


代码(其一):

  1 #include <stdio.h>  2 #include <netinet/in.h>  3 #include <string.h>  4 #include <time.h>  5   6 int main(int argc, char *argv[])  7 {  8         int sockfd, listenfd;  9         int opt = 1; 10  11         struct sockaddr_in serAddr, cliAddr; 12         socklen_t len; 13  14         time_t mytime; 15         char buf[128]; 16  17         sockfd = socket(AF_INET, SOCK_STREAM, 0); 18         printf("server socket create success. sockfd = %d\n", sockfd); 19         printf(" ***********************************\n"); 20  21         //int setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen); 22         //参数s;套接字,指向一个打开的套接口描述符 23         //参数level:级别,SOL_SOCKET(基本套接口) 24         //参数optname:选项名,SO_REUSEADDR(允许套接口和已使用的地址捆绑) 25         //参数optval:选项值, 26         //参数optlen:选项长度, 27         setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));        //设置套接字属性 28  29         bzero(&serAddr, sizeof(serAddr));       //初始化 serAddr变量 30         serAddr.sin_family = AF_INET; 31         serAddr.sin_port = htons(8888); 32         serAddr.sin_addr.s_addr = htonl(INADDR_ANY); 33  34         //server端 bind 绑定 35         bind(sockfd, (struct sockaddr *)&serAddr, sizeof(struct sockaddr));     //绑定 套接字 和 IP、端口 36         listen(sockfd, 2);      //设置 可同时监听的最大数量 37  38         printf("waiting for being connected ......\n"); 39         listenfd = accept(sockfd, (struct sockaddr *)&cliAddr,&len); 40         printf("finish connect listenfd = %d\n", listenfd); 41         printf(" **********************\n"); 42         if(listenfd < 0) 43         { 44                 perror("ERROR: accept failure.\n"); 45                 return -1; 46         } 47  48         mytime = time(NULL); 49         snprintf(buf, sizeof(buf), "%s", ctime(&mytime));       //缓存变量 50  51 //      write(sockfd,"test",5); 52         write(listenfd, buf, strlen(buf));      //写入(发送) 53         printf("send socket[%d bytes]: %s\n", strlen(buf), buf); 54         close(sockfd); 55         return 0; 56 }


代码(其二):

  1 #include <stdio.h>  2 #include <netinet/in.h>  3 #include <string.h>  4 //#include <sys/socket.h>  5   6 int main(int argc, char *argv[])  7 {  8         int sockfd;  9  10         //short int sin_family; 协议族,在socket编程中 只能是AF_INET 11         //unsigned short int sin_port;  端口号,使用网络字节顺序 12         //struct in_addr sin_addr; 含unsigned long s_addr; 存储IP地址 13         //unsigned char sin_zero[8]; 14         struct sockaddr_in servAddr;    //库 <netinet/in.h> 15  16         int rcvLen; 17         char rcvbuf[128]; 18  19         //int socket(int domain, int type, int protocol) 20         //参数domain;设置网络通信的域,即选择通信协议族。AF_INET为IPv4 21         //参数type:设置套接字通信的类型,主要有SOCK_STREAM(流式套接字,TCP连接)、SOCK_DGRAM(数据包套接字,UDP连接) 22         //参数protocol:制定type协议类型中的某个特定类型。通常某协议中只有一种特定类型,即protocol参数仅能设为0 23         sockfd = socket(AF_INET, SOCK_STREAM, 0);       //创建 套接字 24         printf("client socket create success. sockfd = %d\n", sockfd); 25  26         bzero(&servAddr, sizeof(servAddr));     //初始化 servAddr变量 27         servAddr.sin_family = AF_INET; 28         servAddr.sin_port = htons(8888); 29         servAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 30  31         //client端 connect 连接 32         connect(sockfd, (struct sockaddr *)&servAddr, sizeof(servAddr));        //连接 套接字 和 IP 33         rcvLen = read(sockfd, rcvbuf, 128);     //读取 信息 34  35         if(rcvLen < 0) 36         { 37                 printf("ERROR: read failure.\n"); 38                 return -1; 39         } 40         if(rcvLen == 0) 41         { 42                 printf("Server close connection.\n"); 43                 return -1; 44         } 45         printf("receive data[%d bytes]: %s\n", rcvLen, rcvbuf); 46  47         close(sockfd); 48  49         return 0; 50 }

执行: