网络编程函数2

本文详细介绍了网络编程中常用的套接字函数,包括accept()、send()、recv()、sendto()、recvfrom()、close()、shutdown()、getpeername()和gethostname()。accept()用于等待并接受客户端连接,send()和recv()用于数据传输,sendto()和recvfrom()适用于无连接的数据报套接字,close()关闭套接字,shutdown()则提供了更细粒度的关闭选项,getpeername()获取对端信息,gethostname()获取本地主机名。这些函数是网络编程的基础,理解并正确使用它们对于建立可靠的网络通信至关重要。

网络编程函数2

函数accept();send();recv();sendto();recvfrom();close();shutdown();getpeername();gethostname();

accept():

函数作用

accept()函数用于等待连接,客户端从我监听(listen())的端口连接到我的机器上,他的连接将加入一个等待连接(accept())队列中,我调用accept()表示有空闲的连接,并在连接后返回一个新的套接字描述符。
原本的套接字还在监听端口,新的套接字用于发送和接受数据。

函数定义
#include <sys/types.h>   
#include <sys/socket.h>
int accept(int s, struct sockaddr * addr, int * addrlen);

原型:

WINSOCK_API_LINKAGE
SOCKET
WSAAPI
accept(
    SOCKET s,
    struct sockaddr FAR * addr,
    int FAR * addrlen
    );
函数说明

accept()用来接受参数s 的socket 连接. 参数s 的socket 必需先经bind()、listen()函数处理过, 当有连线进来时accept()会返回一个新的socket 处理代码, 往后的数据发送与读取就是经由新的socket处理, 而原来参数s 的socket 能继续使用accept()来接受新的连线要求. 连线成功时, 参数addr 所指的结构会被系统填入远程主机的地址数据, 参数addrlen 为scokaddr 的结构长度.

return

成功返回新的socket套接字描述符,失败返回-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),8);  

 

       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() 和 recv() 函数

函数作用

send() and recv()用于流式套接字或数据报套接字的通讯。

send()函数:

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

sockfd 是你想发送数据的套接字描述符(或者是调用 socket() 或者是accept()返回的)。 msg 是指向你想发送的数据的指针。len 是数据的长度。 把 flags 设置为 0 就可以了。
返回:
send() 返回实际发送的数据的字节数–它可能小于你要求发送的数目!错误时返回-1,并设置errno。
recv()函数:

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

sockfd 是要读的套接字描述符。buf 是要读的信息的缓冲。len 是缓冲的最大长度flags 可以设置为0。(请参考recv() 的 man page) recv() 返回实际读入缓冲的数据的字节数。或者在错误的时候返回-1, 同时设置 errno。

sendto() 和 recvfrom() 函数

使用:

sendto() 和 recvfrom() 函数用于无连接数据报套接字

函数定义:

sendto():

int sendto(int sockfd, const void *msg, int len, unsigned int flags,const struct sockaddr *to, int tolen); 

前四个参数和send()函数一样,第五个参数to是个指向数据结构 struct sockaddr 的指针,它包含了目的地的 IP 地址和端口信息。tolen 可以简单地设置为 sizeof(struct sockaddr)。 和函数 send() 类似,sendto() 返回实际发送的字节数(它也可能小于你想要发送的字节数!),在错误的时候返回 -1。
recvfrom():

int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);

除了两个增加的参数外,这个函数和 recv() 也是一样的。from 是一个指向局部数据结构 struct sockaddr 的指针,它的内容是源机器的 IP 地址和端口信息。fromlen 是个 int 型的局部指针,它的初始值为 sizeof(struct sockaddr)。函数调用返回后,fromlen 保存着实际储存在 from 中的地址的长度
返回收到的字节长度,发生错误时返回-1;

close() 和 shutdown()函数

使用:

close()用于关闭套接字描述符;

close(sockfd);

防止套接字上产生更多的数据读写,减少错误信息的产生。

sutdown() 比close()功能更加强大一些,它允许关闭单边通讯或者双向通讯。

int shutdown(int sockfd, int how); 

sockfd 是你想要关闭的套接字文件描述复。how 的值是下面的其中之 一:

0 - 不允许接受

1 - 不允许发送

2 - 不允许发送和接受(和close() 一样)

getpeername() 和 gethostname()函数

getpeername()作用:告诉你连接的流式套接字上谁在另一边。

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

sockfd 是连接的流式套接字的描述符。addr 是一个指向结构 struct sockaddr (或者是 struct sockaddr_in) 的指针,它保存着连接的另一边的信息。addrlen 是一个 int 型的指针,它初始化为sizeof(struct sockaddr)。 函数在错误的时候返回 -1,设置相应的 errno。

一旦你获得它们的地址,你可以使用 inet_ntoa() 或者 gethostbyaddr() 来打印或者获得更多的信息
gethostname()作用:
它返回你程序所运行的机器的主机名字。然后你可以使用gethostbyname() 以获得你的机器的IP 地址。

#include <unistd.h>

int gethostname(char *hostname, size_t size);

参数:hostname 是一个字符数组指针,它将在函数返回时保存主机名。size是hostname 数组的字节长度。

函数调用成功时返回 0,失败时返回 -1,并设置errno。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值