Linux C 套接字socket TCP(1)




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 }

执行:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值