【网络编程】TCP有关函数

来源:互联网 发布:孙悟空法力 知乎 编辑:程序博客网 时间:2024/06/05 06:12

1、socket函数

原型:int socket(int family, int type, int protocol);

作用:建立一下新的socket套接字

参数:family:表示使用的是何种地址类型;AF_INET,IPV4;AF_INET6,IPV6;

           类型:SOCK_STREAM 用于TCP

                      SOCK_DGRAM  用于UDP

          protocol:传输协议编号,设为0即可

返回值:成功返回socket套接字描述符;失败返回-1。

头文件:#include<sys/types.h>

              #include<sys/socket.h>


2、bind函数

原型:int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen); 

作用:绑定IP地址

参数:sockfd:套接字描述符

           myaddr:是一个指向sockaddr结构的地址 

   struct sockaddr_in
    {
       short int sin_family;  /* Internet地址族 */
       unsigned short int sin_port;  /* 端口号 */
       struct in_addr sin_addr;   /* IP地址 */
       unsigned char sin_zero[8];  /* 填0 */
     };

               addrlen:为参数sockaddr的长度

返回值:成功返回0,失败返回-1,错误的原因在errno中

头文件:#include<sys/types.h>

               #include<sys/socket.h>


在bind之前要先对结构体进行设置:

bzero(&servaddr, sizeof(servaddr)); 

servaddr.sin_family = AF_INET; 

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

 servaddr.sin_port = htons(SERV_PORT);
首先将整个结构体清零,然后设置地址类型为AF_INET,网络地址为INADDR_ANY,这个宏表示本地的任意IP地址,因为服务器可能有多个网卡,每个网卡也可能绑定多个IP地址,这样设置可以在所有的IP地址上监听,直到不某个客户端建立了连接时才确定下来到底用哪个IP地址,端口号为SERV_PORT,我们定义为8000 


3、listen

原型:int listen(int sockfd,int backlog);

作用:监听网络,等待参数sockfd的socket连线

参数:sockfd:套接字描述符

           backlog:同时能处理的最大连接要求

返回值:成功返回0,失败返回-1,错误原因在errno

头文件:#inlcude<sys/socket>

注意:listen并未真正开始接收连线,真正接受client端连线的是accept


4、accpet

原型:int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen); 

作用:用于接受socket的连线

参数:sockfd:套接字描述符

           cliaddr:连接成功之后,填充的是客户端的地址

           addrlen:sockaddr的地址

返回值:成功返回新的套接字,失败返回-1

头文件:#include<sys/types.h>

               #include<sys/socket.h>


5、connect

原型:int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); 

作用:建立socket套接字,通常客户端连接服务器

参数:sockfd:套接字描述符

           addr:sockaddr的结构体

           addrlen:sockaddr的长度

返回值:成功返回0,失败返回-1

头文件:#include<sys/types.h>

               #include<sys/socket.h>


6、send

原型:int send(int sockfd,const void*msg,int len ,unsigned int falgs);

作用:经过socket传送数据,向对方发送数据

参数:sockfd:套接字描述符,在服务器那端接受的应该为accept返回的新的描述符

           msg:欲连线的的数据内容

           len:信息的长度

           falgs:一般设为0

返回值:成功返回实际传送出去的字符数,失败返回-1,错误原因在errno中

头文件:#include<sys/types.h>

               #include<sys/socket.h>


7、recv

原型:int recv(int sockfd,void*buf,int len,unsigned int flags);

作用:经过socket接受套接字

参数:sockfd:套接字描述符,在服务器那端接受的应该为accept返回的新的描述符

           buf:接受数据的空间

           len:接受字符的长度

           flags:一般设置为0

返回值:成功返回接受的字符数,失败-1

头文件:#include<sys/types.h>

               #include<sys/socket.h>


tcp服务器:

#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define portnumber 3333int main(int argc, char *argv[]) { int sockfd,new_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size; int nbytes;char buffer[1024];   //1. socketif((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:IPV4;SOCK_STREAM:TCP{ fprintf(stderr,"Socket error:%s\n\a",strerror(errno)); exit(1); }    //2.bindbzero(&server_addr,sizeof(struct sockaddr_in)); // 初始化,置0server_addr.sin_family=AF_INET;                 // Internetserver_addr.sin_addr.s_addr=htonl(INADDR_ANY);  // (将本机器上的long数据转化为网络上的long数据)和任何主机通信  //INADDR_ANY 表示可以接收任意IP地址的数据,即绑定到所有的IP//server_addr.sin_addr.s_addr=inet_addr("192.168.1.1");  //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ipserver_addr.sin_port=htons(portnumber);         // (将本机器上的short数据转化为网络上的short数据)端口号    // server_addr.sin_addr.s_addr=inet_addr("192.168.1.199");//;htonl(INADDR_ANY);/* 捆绑sockfd描述符到IP地址 */ if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,"Bind error:%s\n\a",strerror(errno)); exit(1); }    //3.listen      if (listen(sockfd, 5)==-1)      {          printf("listen error\n");      }    while(1)  {     sin_size=sizeof(struct sockaddr_in);    printf("1\n");   //4.accept   if(( new_fd =  accept(sockfd, (struct sockaddr *)(&client_addr),  &sin_size)) <0)   {printf("accept error.\n");    }  fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));    //5.recv/sendif((nbytes=read(new_fd,buffer,1024))==-1) { fprintf(stderr,"Read Error:%s\n",strerror(errno)); exit(1); } buffer[nbytes]='\0';printf("Server received %s\n",buffer);/* 这个通讯已经结束 */ close(new_fd); /* 循环下一个 */ } /* 结束通讯 */ close(sockfd); exit(0); } 

tcpclient.c

#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define portnumber 3333int main(){   int sockfd;    struct sockaddr_in serv_addr;    int addlen=sizeof(struct sockaddr);    char buf[512]="hello world";   //1.socket    if ((sockfd = socket(AF_INET,  SOCK_STREAM, 0))==-1)    {printf("socket error");    }        bzero(&serv_addr,sizeof(serv_addr));     serv_addr.sin_family = AF_INET;     serv_addr.sin_port =  htons(portnumber);     serv_addr.sin_addr.s_addr=inet_addr("192.168.1.199");    //2.connect    if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) <0)    {printf("connect error\n");    }        //3.send   if( send(sockfd, buf, strlen(buf), 0 ) <0)   {       printf("send error\n");   }    //4.close   close(sockfd);}


 

       

           


0 0
原创粉丝点击