socket通信中的几个函数--accept(),send(),recv()

来源:互联网 发布:idea关联源码 编辑:程序博客网 时间:2024/05/16 03:21


accept()函数
 accept()会有点古怪的地方的!你可以想象发生这样的事情:有人从很远的地方通过一个你在侦听   (listen())的端口连接(connect())到你的机器。它的连接将加入到等待接受(accept())的队列中。你调用accept()告诉它你有空闲的连接。它将返回一个新的套接字文件描述符!这样你就有两个套接字了,原来的一个还在侦听你的那个端口,新的在准备发送   (send())和接收(recv())数据。这就是这个过程!  

函数是这样定义的:   
#include   <sys/socket.h>
int   accept(int   sockfd,   void   *addr,   int   *addrlen);   
sockfd相当简单,是和listen()中一样的套接字描述符。addr是个指向局部的数据结构sockaddr_in指针。这是要求接入的信息所要去的地方(你可以测定那个地址在那个端口呼叫你)。在它的地址传递给accept之前,addrlen是个局部的整形变量,设置为   sizeof(struct   sockaddr_in)。   accept将不会将多余的字节给addr。如果你放入的少些,那么它会通过改变addrlen的值反映出来。   
同样,在错误时返回-1,并设置全局错误变量   errno。   
现在是你应该熟悉的代码片段。   
#include   <string.h>
#include   <sys/socket.h>
#include   <sys/types.h>
#define   MYPORT   3490     
#define   BACKLOG   10     
main()   
     {   
  int   sockfd,   new_fd;     
  struct   sockaddr_in   my_addr;     
  struct   sockaddr_in   their_addr;     
  int   sin_size;   
sockfd   =   socket(AF_INET,   SOCK_STREAM,   0);     
my_addr.sin_family   =   AF_INET;     
  my_addr.sin_port   =   htons(MYPORT);     
  my_addr.sin_addr.s_addr   =   INADDR_ANY;     
  bzero(&(my_addr.sin_zero),;     
    
  bind(sockfd,   (struct   sockaddr   *)&my_addr,   sizeof(struct   sockaddr));   
   listen(sockfd,   BACKLOG);   
   sin_size   =   sizeof(struct   sockaddr_in);    
 new_fd   =   accept(sockfd,   &their_addr,   &sin_size);   
     .   
     .   
     .   
注意,在系统调用send() 和recv()中你应该使用新的套接字描述符new_fd。如果你只想让一个连接进来,那么你可以使用close()去关闭原来的文件描述符sockfd来避免同一个端口更多的连接。

send() and recv()
当一个连接建立以后,就可以传输数据了。常用的系统调用有send()和recv()。
send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下:
int PASCAL FAR send(SOCKET s, const char FAR *buf, int len, int flags);
参数s为已连接的本地套接字描述符。buf 指向存有发送数据的缓冲区的指针,其长度由len 指定。flags 指定传输控制方式,如是否发送带外数据等。如果没有错误发生,send()返回总共发送的字节数。否则它返回SOCKET_ERROR。

recv()调用用于在参数s指定的已连接的数据报或流套接字上接收输入数据,格式如下:
int PASCAL FAR recv(SOCKET s, char FAR *buf, int len, int flags);
参数s 为已连接的套接字描述符。buf指向接收输入数据缓冲区的指针,其长度由len 指定。flags 指定传输控制方式,如是否接收带外数据等。如果没有错误发生,recv()返回总共接收的字节数。如果连接被关闭,返回0。否则它返回SOCKET_ERROR。

原创粉丝点击