设为首页 加入收藏

TOP

网络编程TCP总结及实践-C语言(三)
2015-07-24 05:39:08 来源: 作者: 【 】 浏览:22
Tags:网络编程 TCP 总结 实践 语言
sa_family èAF_INET uint16_t sin_port; //为使用的port编号 struct in_addr sin_addr; //为IP 地址 unsigned char sin_zero[8]; //未使用 }; struct in_addr { uint32_t s_addr; };

addrlen sockaddr的结构体长度。通常是计算sizeof(struct sockaddr);

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

常用实例:struct sockaddr_in my_addr; //定义结构体变量

  memset(&my_addr, 0, sizeof(struct sockaddr)); //将结构体清空
  //或bzero(&my_addr, sizeof(struct sockaddr));
  my_addr.sin_family = AF_INET;  //表示采用Ipv4网络协议
  my_addr.sin_port = htons(8888);  //表示端口号为8888,通常是大于1024的一个值。
//htons()用来将参数指定的16位hostshort转换成网络字符顺序
my_addr.sin_addr.s_addr = inet_addr("192.168.0.101"); //inet_addr()用来将IP地址字符串转换成网络所使用的二进制数字,如果为INADDR_ANY,这表示服务器自动填充本机IP地址。
if(bind(sfd, (struct sockaddr*)&my_str, sizeof(struct socketaddr)) == -1)
{perror("bind");close(sfd);exit(-1);}

(注:通过将my_addr.sin_port置为0,函数会自动为你选择一个未占用的端口来使用。同样,通过将my_addr.sin_addr.s_addr置为INADDR_ANY,系统会自动填入本机IP地址。)

4. listen函数:使服务器的这个端口和IP处于监听状态,等待网络中某一客户机的连接请求。如果客户端有连接请求,端口就会接受这个连接。

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

参数:sockfdà为前面socket的返回值.即sfd

backlogà指定同时能处理的最大连接要求,通常为10或者5。最大值可设至128

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

常用实例:

if(listen(sfd, 10) == -1)
  {perror("listen");close(sfd);exit(-1);}

5. accept函数:接受远程计算机的连接请求,建立起与客户机之间的通信连接。服务器处于监听状态时,如果某时刻获得客户机的连接请求,此时并不是立即处理这个请求,而是将这个请求放在等待队列中,当系统空闲时再处理客户机的连接请求。当accept函数接受一个连接时,会返回一个新的socket标识符,以后的数据传输和读取就要通过这个新的socket编号来处理,原来参数中的socket也可以继续使用,继续监听其它客户机的连接请求。(也就是说,类似于移动营业厅,如果有客户打电话给10086,此时服务器就会请求连接,处理一些事务之后,就通知一个话务员接听客户的电话,也就是说,后面的所有操作,此时已经于服务器没有关系,而是话务员跟客户的交流。对应过来,客户请求连接我们的服务器,我们服务器先做了一些绑定和监听等等操作之后,如果允许连接,则调用accept函数产生一个新的套接字,然后用这个新的套接字跟我们的客户进行收发数据。也就是说,服务器跟一个客户端连接成功,会有两个套接字。)

原型:int accept(int s,struct sockaddr * addr,int * addrlen);

参数:sà为前面socket的返回值.即sfd

addrà为结构体指针变量,和bind的结构体是同种类型的,系统会把远程主机的信息(远程主机的地址和端口号信息)保存到这个指针所指的结构体中。

addrlenà表示结构体的长度,为整型指针

返回值:成功则返回新的socket处理代码new_fd,失败返回-1

常用实例:

struct sockaddr_in clientaddr;
  memset(&clientaddr, 0, sizeof(struct sockaddr));
  int addrlen = sizeof(struct sockaddr);
  int new_fd = accept(sfd, (struct sockaddr*)&clientaddr, &addrlen);
  if(new_fd == -1)
  {perror("accept");close(sfd);exit(-1);}
  printf("%s %d success connect\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));

6. recv函数:用新的套接字来接收远端主机传来的数据,并把数据存到由参数buf 指向的内存空间

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

参数:sockfdà为前面accept的返回值.即new_fd,也就是新的套接字。

buf 表示缓冲区

len 表示缓冲区的长度

flags 通常为0

返回值:成功则返回实际接收到的字符数,可能会少于你所指定的接收长度。失败返回-1

常用实例:

char buf[512] = {0};
 if(recv(new_fd, buf, sizeof(buf), 0) == -1)  最好传长度 来防止阻塞
  {perror("recv");close(new_fd);close(sfd);exit(-1);}
  puts(buf);


7. send函数:用新的套接字发送数据给指定的远端主机

原型:int send(int s,const void * msg,int len,unsigned int flags);

参数:sà为前面accept的返回值.即new_fd

msgà一般为常量字符串

lenà表示长度

flagsà通常为0

返回值:成功则返回实际传送出去的字符数,可能会少于你所指定的发送长度。失败返回-1

常用实例:

if(send(new_fd, "hello", 6, 0) == -1)
{perror("send");close(new_fd);close(sfd);exit(-1);}

8. close函数:当使用完文件后若已不再需要则可使用close()关闭该文件,并且close()会让数据写回磁盘,并释放该文件所占用的资源

原型:int close(int fd);

参数:fdà为前面的sfd,new_fd

返回值:若文件顺利关闭则返回0,发生错误时返回-1

常用实例:

close(new_fd);
  close(sfd);
//通过TCP实现的服务器文件下载功能
#ifndef __MY_SOCKET_H__
#define __MY_SOCKET_H__
#include 
   
    
#include "msg.h"
#include 
    
      #include 
     
       #include 
      
        #include 
       
首页 上一页 1 2 3 4 5 下一页 尾页 3/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 1014 Uniform Generator 题解 下一篇POJ 2488:A Knight's Journey

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: