首页 > 代码库 > C网络编程-TCP套接口编程

C网络编程-TCP套接口编程

只有几个基本的示例如下

建立服务端的绑定监听等过程的函数

 1 #include<sys/types.h> 2 #include<sys/socket.h> 3  4 #include<netinet/in.h> 5 #include<arpa/inet.h> 6 #include<unistd.h> 7  8 #include<stdio.h> 9 #include<stdlib.h>10 11 #include<strings.h>12 #define PORT 234513 14 int main(void)15 {16     int sockfd,newsockfd; //socket 描述符17     18     struct sockaddr_in addr;    //IPv4套接口数据结构体19 20     //  struct sockaddr_in21     //  {22     //      uint8_t sin_len;            //长度,固定16位23     //      sa_family_t sin_family;     //地址族,IPv4为AF_INET24     //      in_port_t sin_port;         //端口号25     //      struct in_addr sin_addr;    26     //      //27     //      //  struct in_addr28     //      //  {29     //      //     in_addr_t s_addr;    //32位的IP地址30     //      //  }31     //      //32     //      //33     //      unsigned char sin_zero[8];  //未使用的字段被填充为034     //  }35 36     int addr_len=sizeof(struct sockaddr_in);37 38     if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)39         //创建socket,返回描述符,使用IPv4和流40     {41         perror("create socket error!\n");42         exit(1);43     }44     else45     {46         printf("successfully create socket\n");47         printf("socket id is %d\n",sockfd);48     }49 50     //将表示地址的结构体变量addr数据清空51     bzero(&addr,sizeof(struct sockaddr_in));52 53     //重新设定相关参数54     //使用IPv4,设置port号,还有IP地址55     addr.sin_family=AF_INET;56     addr.sin_port=htons(PORT);57     //绑定夲机默认地址58     addr.sin_addr.s_addr=htonl(INADDR_ANY);59 60 61     62     if(bind(sockfd,(struct sockaddr *)(&addr),sizeof(struct sockaddr))<0)63         //绑定套接口和参数64     {65         perror("bind error\n");66         exit(1);67     }68     else69     {70         printf("bind succefully\n");71         printf("local POST is %d\n",PORT);72     }73 74     //下面是监听过程75     if(listen(sockfd,5)<0)76     {77         perror("listen error\n");78         exit(1);79     }80     else81     {82         printf("listening........\n");83     }84 85     if((newsockfd=accept(sockfd,(struct sockaddr *)(&addr),&addr_len)<0))86     {87         perror("accept error\n");88     }89     else90     {91         printf("accept a new socket client\n");92         printf("socket id is %d\n",newsockfd);93     }94 95     return 0;96 }

 

连接远程主机的函数,用于服务端,使用百度的IP测试:

 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<strings.h> 4 #include<netinet/in.h> 5 #include<arpa/inet.h> 6 #include<sys/types.h> 7 #include<sys/socket.h> 8 #include<sys/stat.h> 9 #include<fcntl.h>10 #include<unistd.h>11 12 #define PORT 8013 #define REMOTE_IP "119.75.218.77"14 15 int main(void)16 {17     int sockfd;18     struct sockaddr_in addr;19     if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)20     {21         perror("error to socket :");22         exit(1);23     }24     else25     {26         printf("have open socket in %d\n",sockfd);27     }28 29     bzero(&addr,sizeof(struct sockaddr_in));30     addr.sin_family=AF_INET;31     addr.sin_port=htons(PORT);32     addr.sin_addr.s_addr=inet_addr(REMOTE_IP);33 34     if(connect(sockfd,(struct sockaddr *)(&addr),sizeof(struct sockaddr))<0)35     {36         perror("error to connect : ");37         exit(1);38     }39     else40     {41         printf("connect successfully\n");42     }43     return 0;44 }

 

相关结构体定义:

/* Structure describing an Internet socket address.  */struct sockaddr_in  {    __SOCKADDR_COMMON (sin_);    in_port_t sin_port;            /* Port number.  */    struct in_addr sin_addr;        /* Internet address.  */    /* Pad to size of `struct sockaddr‘.  */    unsigned char sin_zero[sizeof (struct sockaddr) -               __SOCKADDR_COMMON_SIZE -               sizeof (in_port_t) -               sizeof (struct in_addr)];  };

 

使用recv接受远程服务器的返回信息

ftp.gnu.org IP=208.118.235.20

 1 #include<stdio.h> 2 #include<strings.h> 3 #include<arpa/inet.h> 4 #include<netinet/in.h> 5 #include<unistd.h> 6 #include<stdlib.h> 7 #include<fcntl.h> 8 #include<sys/stat.h> 9 #include<sys/socket.h>10 #include<sys/types.h>11 12 //ftp默认端口是2113 #define PORT 2114 #define REMOTE_IP "208.118.235.20"15 16 17 int main(void)18 {19     int sockfd;20     struct sockaddr_in addr;21     char buf[1024];22 23     if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)24     {25         perror("error to socket :");26         exit(1);27     }28     else29     {30         printf("successful sockfd is %d\n",sockfd);31     }32 33     bzero(&addr,sizeof(struct sockaddr_in));34     addr.sin_family=AF_INET;35     addr.sin_port=htons(PORT);36     addr.sin_addr.s_addr=inet_addr(REMOTE_IP);37 38     if(connect(sockfd,(struct sockaddr *)(&addr),sizeof(struct sockaddr))<0)39     {40         perror("error on connect :");41         exit(1);42     }43     else44     {45         printf("connect gun successfully\n");46         printf("IP=%s\n",REMOTE_IP);47         printf("PORT=%d\n\n",PORT);48     }49 50     //接受数据51     recv(sockfd,buf,sizeof(buf),0);52 53     printf("msg receved\n");54     //输出数据55     printf("%s",buf);56 57     printf("\n");58 59     return 0;60 }

 

使用read读取数据:

 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<strings.h> 4 #include<netinet/in.h> 5 #include<arpa/inet.h> 6 #include<sys/types.h> 7 #include<sys/socket.h> 8 #include<sys/stat.h> 9 #include<fcntl.h>10 #include<unistd.h>11 12 #define PORT 234513 #define REMOTE_IP "192.168.1.102"14 15 int main(void)16 {17     int sockfd;18     int newsockfd;19 20     struct sockaddr_in addr;21 22     int addr_len=sizeof(struct sockaddr_in);23 24     char msgbuf[256];25 26     if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)27     {28         perror("error to socket :");29         exit(1);30     }31     else32     {33         printf("have open socket in %d\n",sockfd);34     }35 36     bzero(&addr,sizeof(struct sockaddr_in));37     addr.sin_family=AF_INET;38     addr.sin_port=htons(PORT);39     addr.sin_addr.s_addr=htons(INADDR_ANY);40 41     if(bind(sockfd,(struct sockaddr *)(&addr),sizeof(struct sockaddr))<0)42     {43         perror("bind error :");44         exit(1);45     }46     else47     {48         printf("bind OK!\n");49     }50 51     if(listen(sockfd,5)<0)52     {53         printf("listen error :");54         exit(1);55     }56     else57     {58         printf("listening ...\n");59     }60 61     if((newsockfd=accept(sockfd,(struct sockaddr *)(&addr),&addr_len)))62     {63         perror("accept error");64         exit(1);65     }66     else67     {68         printf("accept OK!\n");69 70         if(read(newsockfd,msgbuf,sizeof(msgbuf))<=0)71         {72             perror("read error :");73             exit(1);74         }75         else76         {77             printf("msgbox : %s \n",msgbuf);78         }79     }80 81     return 0;82 }

 

C网络编程-TCP套接口编程