下面,我们将可以使用新创建的套接口文件描述符new_fd来调用send()recv()

 

send() recv()

 

 

系统调用send()的用法如下:

 

int send(int sockfd,const void* msg,int len,int flags);

 

第一个参数是你希望给发送数据的套接口文件描述符。它可以是你通过socket()系统调用返回的,也可以是通过accept()系统调用得到的。

 

第二个参数是指向你希望发送的数据的指针。

 

第三个参数是数据的字节长度。第四个参数标志设置为0

 

下面是一个简单的例子:

 

char*msg="beejwashere!";

 

intlen,bytes_sent;

 

..

 

len=strlen(msg);

 

bytes_sent=send(sockfd,msg,len,0);

 

...

 

系统调用send()返回实际发送的字节数,这可能比你实际想要发送的字节数少。如果返回的字节数比要发送的字节数少,你在以后必须发送剩下的数据。当send()出错时,将返回-1

 

系统调用recv()的使用方法和send()类似:

 

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

 

第一个参数是要读取的套接口文件描述符。

 

第二个参数是保存读入信息的地址。

 

第三个参数是缓冲区的最大长度。第四个参数设置为0

 

系统调用recv()返回实际读取到缓冲区的字节数,如果出错则返回-1

 

这样使用上面的系统调用,你可以通过数据流套接口来发送和接受信息。

 

sendto() recvfrom()

 

 

因为数据报套接口并不连接到远程的主机上,所以在发送数据包之前,我们必须首先给出目的地址,请看:

 

int sendto(int sockfd,const void* msg,int len,unsigned int flags,

 

conststruct sockaddr*to,inttolen);

 

除了两个参数以外,其他的参数和系统调用send()时相同。

 

参数to是指向包含目的ip地址和端口号的数据结构sockaddr的指针。

 

参数tolen可以设置为sizeof(structsockaddr)

 

系统调用sendto()返回实际发送的字节数,如果出错则返回-1

 

系统调用recvfrom()的使用方法也和recv()的十分近似:

 

int recvfrom(int sockfd,void* buf,int len,unsigned int flags

 

struct sockaddr* from,int* fromlen);

 

参数from是指向本地计算机中包含源ip地址和端口号的数据结构sockaddr的指针。

 

参数fromlen设置为sizeof(struct sockaddr)

 

系统调用recvfrom()返回接收到的字节数,如果出错则返回-1

 

 

close() shutdown()

 

 

你可以使用close()调用关闭连接的套接口文件描述符:

 

close(sockfd);

 

这样就不能再对此套接口做任何的读写操作了。

 

使用系统调用shutdown(),可有更多的控制权。它允许你在某一个方向切断通信,或者切断双方的通信:

 

int shutdown(int sockfd,int how);

 

第一个参数是你希望切断通信的套接口文件描述符。第二个参数how值如下:

 

0—furtherreceivesaredisallowed

 

1—furthersendsaredisallowed

 

2—furthersendsandreceivesaredisallowed(likeclose())

 

shutdown()如果成功则返回0,如果失败则返回-1

 

getpeername()

 

 

这个系统的调用十分简单。它将告诉你是谁在连接的另一端:

 

#include<sys/socket.h>

 

int getpeername(int sockfd,struct sockaddr* addr,int* addrlen);

 

第一个参数是连接的数据流套接口文件描述符。

 

第二个参数是指向包含另一端的信息的数据结构sockaddr的指针。

 

第三个参数可以设置为sizeof(structsockaddr)

 

如果出错,系统调用将返回-1

 

一旦你获得了它们的地址,你可以使用inet_ntoa()或者gethostbyaddr()来得到更多的信息。

 

gethostname()

 

 

系统调用gethostname()比系统调用getpeername()还简单。它返回程序正在运行的计算机的名字。系统调用gethostbyname()可以使用这个名字来决定你的机器的ip地址。

 

下面是一个例子:

 

#include<unistd.h>

 

int gethostname(char*hostname,size_tsize);

 

如果成功,gethostname将返回0。如果失败,它将返回-1