您的位置:首页 > 理论基础 > 计算机网络

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

2017-09-08 17:04 363 查看

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python socket tcp