4>返回值:accept()函数的返回值是新连接的客户端套接字文件描述符,与客户端之间的通信是通过accept()返回的新套接字文件描述符来进行的,而不是通过建立套接字时的文件描述符。如果accept()函数发生错误,accept()会返回-1,通过errno可以得到错误值。
5>如果参数sock_fd所指定的套接字被设置为阻塞方���(Linux下的默认方式),且连接请求队列为空,则accept()将被阻塞直到有连接请求到此为止;如果参数s所指定的套接字被设置为非阻塞方式,如果队列为空,accept将立即返回-1,errno被设置为EAGAIN.
6>实例:
int client_fd;
int client_len;
struct sockaddr_in client_addr;
client_len = sizeof(struct sockaddr_in);
client_fd = accept(sock_fd,(struct sockaddr *)&client_addr,&client_len);
if(conn_fd< 0){
perror(“accept”);
exit(1);
}
5. connect(连接目标网络服务器)
1>函数功能:
客户端在建立套接字之后,不需要进行地址绑定,就可以直接连接服务器。连接服务器的函数为connect(),此函数连接指定参数的服务器,例如IP地址,端口号。
如果是TCP编程,则connect()函数用于服务器发出连接请求,服务器的IP地址和端口号由 参数serv_addr指定。
如果是UDP编程,则connect函数并不建立真正的连接,它只是告诉内核与该套接字进行通信的目的地址(由第二个参数指定),只有该目的地址发来的数据才会被该socket接收。调用connect函数的好处是不必在每次发送和接收数据时都指定目的地址。
2>函数原型:
#include<sys/types.h>
#include<sys/socket.h>
int connect(int sock_fd,struct sockaddr *serv_addr,socklen_taddrlen);
3>形参:
? sock_fd:建立套接字时返回的套接字文件描述符,调用socket()返回的。
? serv_addr:是一个指向数据结构sockaddr的指针,其中包括客户端需要连接的服务器的目的IP地址和端口号。
? addrlen:表示了第二了参数的大小,可以使用sizeof(struct sockaddr)
4>执行成功后返回0,有错误发生则返回-1,错误代码存入errno中。
5>实例:
int sock_fd;
struct sockaddr_in serv_addr;
if(-1 == (sock_fd == socket(AF_INET,SOCK_STREAM,0))){
printf(“Error: Unable to createsocket(%i)…\n”,errno);
perror(“sockets”);
exit(1);
}
memset(&serv_addr,0,sizeof(structsockaddr_in));
serv_addr.sin_family= AF_INET;
serv_addr.sin_port= htons(DEST_PORT);
serv_addr.sin_addr.s_addr= inet(DEST_IP_ADDRESS);
if(-1== connect(sock_fd,(struct sockaddr *)&serv_add,sizeof(struct sockaddr))){
printf(“Error:unable to the establishconnection to socket(%i)…\n”,errno);
perror(“socks”);
close(sock_fd);
exit(1);
}
6. send(发送数据)
1>函数功能:函数send用来在TCP套接字上发送数据,send只能对处于连接状态的套接字使用。
2>函数原型
#include<sys/types.h>
#include<sys/socket.h>
ssize_t send(int conn_fd,const void *msg,size_t len, int flags);
3>函数形参:
? conn_fd:为已建立好连接的套接字描述符,即调用accept()函数后返回的套接字描述符。
? msg:存放发送数据的缓冲区。
? len:发送缓冲区的长度
? flags:为控制选项,一般设置为0,或取以下值:
2 MSG_OOB:在指定的套接字上发送带外数据(out-of-band data),该类型的套接字必须支持带外数据(如:SOCK_STREAM).
2 MSG_DONTROUTE:通过最直接的路径发送数据,而忽略下层协议的路由设置。
4>返回值:
执行成功返回实际发送数据的字节数,出错则返回-1,错误代码存入errno中。
执行成功只是说明数据写入套接字的缓冲区中,并不表示数据已经成功地通过网络发送到目的地。
5>实例:
#define BUFFERSIZE 1500
char send_buf[BUFFERSIZE];
……
if(send(conn_fd,send_buf,len,0)< 0){
perror(“send”);
exit(1);
}
7. recv(接收数据)
1>函数功能:recv()用来TCP套接字上接收数据。函数recv从指定的套接字描述符上接收数据并保存到指定buf中。
2>函数原型
#include<sys/types.h>
#include<sys/socket.h>
ssize_t recv(int conn_fd,void *buf,size_t len,int flags);
3>函数形参:
? conn_fd: 为已建立好连接的套接字描述符,即调用accept()函数后返回的套接字描述符
? buf:接收缓冲区
? len:接收缓冲区的大小
? flags:为控制选项,一般设置为0或取以下数值
2 MSG_OOB:请求接收带外数据
2 MSG_PEEK:只查看数据而不读出
2 MSG_WAITALL:只在接收缓冲区满时才返回。
4>函数返回值
函数执行成功返回接收到的数据字节数,出错返回-1,错误代码存入errno中。
5>实例:
#define BUFFERSIZE 1500
char recv_buf[BUFFERSIZE];
……
if(recv(conn_fd,recv_buf,sizeof(recv_buf),0)< 0){
perror(“recv”);
exit(1);
}
8. close
1>函数原型:
int close(int fd);
2>函数功能:
函数close用来关闭一个套接字描述符。
3>函数形参:
? 参数fd为一个套接字描述符。
4>返回值:
执行成功返回0,出错则返回-1.错误代码存入errno中。