如果客户端发出连接请求,则必须使用以下函数接受客户端请求:
套接字接受(
插座s,
struct sockaddr FAR*addr,
int FAR*addrlen
);
addr用于存储客户端地址,addrlen在函数调用时设置为addr指向的区域长度,在函数调用结束后设置为实际地址信息的长度。 此函数等待客户端的请求到达。
返回值是一个新的套接字描述符,它代表的是和客户端的新的连接,可以把它理解成是一个客户端的socket,这个socket包含的是客户端的ip和port信息。(当然这个new_socket会从sockfd中继承服务器的ip和port信息,两种都有了),而参数中的SOCKET s包含服务器的ip和端口信息。
于是,之后的send和recv函数的fd都是这个new_fd,即
intsend(intnew_FD,const void *msg,int len,int flags );
intrecv(intnew_FD,void *buf,int len,unsigned int flags );
也就是说,参数实际上是目标软盘,它包含客户端信息,并指示服务器是从客户端接收或发送的。 操作此和文件FILE *fp=fopen (; fwrite(FP、xx、xx、xx ); 是的。 这里的fp表示作为目标的目标文件名。
这样,客户端的connect函数,
intconnect(intsockfd,struct sockaddr *serv_addr,int addrlen );
这里的sockfd有客户端的ip和端口,服务器的ip和端口信息。 所以之后的send ()、recv )有信息。
——3354——3——3————33——33——3——33——33——3——33——33——333——33——3——33——33——3——3——33——3——3——33——333——33——33333
接受(函数
准备好了。 系统调用accept () )会有点奇怪! (有人从很远的地方拦截你(listen ) ) ) ) ) ) )通过端口连接到你的机器(connect ) ) ) ) )。 该连接将添加到等待接受(accept ) )的队列中。 你呼叫accept ()告诉他你有空闲的连接。 返回新的套接字文件描述符。 这样就有两个插座了。 原来的一个还在监听你的端口,新的是发送((send ) ) ) )和接收((recv ) ) ) ) )的数据) )。 这就是这个过程!