网络编程数据结构 及函数总结
来源:互联网 发布:restsharp 对象转json 编辑:程序博客网 时间:2024/04/28 04:48
TCP
服务器端
socket-->bind-->listen-->accept
客户端
socket-->connect
UDP
服务器:socket -> (填充结构) -> bind -> recvfrom
客户端:socket -> (填充结构) -> sendto
1、socket 见以前文章
2、int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
sockfd:是由socket调用返回的文件描述符.
addrlen:是sockaddr结构的长度.
my_addr:是一个指向sockaddr的指针. 在中有 sockaddr的定义
struct sockaddr { unsigned short sa_family; /* 地址族, AF_xxx */ char sa_data[14]; /* 14 字节的协议地址 */ };
不过由于系统的兼容性,我们一般不用这个头文件,而使用另外一个结构(struct sockaddr_in) 来代替.在中有
struct sockaddr_in { short int sin_family; /* 地址族 */ unsigned short int sin_port; /* 端口号 */ struct in_addr sin_addr; /* IP地址 */ unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 */ };我们主要使用Internet所以
sin_family一般为AF_INET,
sin_addr设置为INADDR_ANY表示可以和任何的主机通信,
sin_port是我们要监听的端口号.sin_zero[8]是用来填充的.
status = bind(fd, (struct sockaddr *)&h->local, sizeof(h->local));
if (status == -1) {
ipq_errno = IPQ_ERR_BIND;
close(h->fd);
free(h);
return NULL;
}
3、int listen(int sockfd,int backlog)
sockfd:是bind后的文件描述符.
backlog:设置请求排队的最大长度.当有多个客户端程序和服务端相连时, 使用这个表示可以介绍的排队长度.
listen函数将bind的文件描述符变为监听套接字.返回的情况和bind一样.
listen(hServerSocket_DS,10))//10个客户
cklog对队列中等待服务的请求的数目进行了限制,大多数系统缺省值为20。
4、accept
int accept(int sockfd, struct sockaddr *addr,int *addrlen)
sockfd:是listen后的文件描述符.
addr,addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了. bind,listen和accept是服务器端用的函数,
accept调用时,服务器端的程序会一直阻塞到有一个 客户程序发出了连接. accept成功时返回最后的服务器端的文件描述符,
这个时候服务器端可以向该描述符写信息了. 失败时返回-1
通过调用accept()函数为其建立一个连接,accept()函数将返回一个新的socket描述符,来供这个新连接来使用。而服务器可以继续在以前的那个socket上监听,同时可以在新的socket描述符上进行数据send()(发送)和recv()(接收)操作
5、connect
int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)
sockfd:socket返回的文件描述符.
serv_addr:储存了服务器端的连接信息.其中sin_add是服务端的地址
addrlen:serv_addr的长度
connect函数是客户端用来同服务端连接的.成功时返回0,sockfd是同服务端通讯的文件描述符 失败时返回-1.
6、
int send(int sockfd, const void *msg, int len, int flags); Sockfd是你想用来传输数据的socket描述符,msg是一个指向要发送数据的指针。 Len是以字节为单位的数据的长度。flags一般情况下置为0(关于该参数的用法可参照man手册)。Send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据。所以需要对send()的返回值进行测量。当send()返回值与len不匹配时,应该对这种情况进行处理。
7、
int recvfrom(int sockfd,void *buf,int len,unsigned int lags,struct sockaddr *from,int *fromlen); from是一个struct sockaddr类型的变量,该变量保存源机的IP地址及端口号。fromlen常置为sizeof (struct sockaddr)。当recvfrom()返回时,fromlen包含实际存入from中的数据字节数。Recvfrom()函数返回接收到的字节数或当出现错误时返回-1,并置相应的errno。 应注意的一点是,当你对于数据报socket调用了connect()函数时,你也可以利用send()和recv()进行数据传输,但该socket仍然是数据报socket,并且利用传输层的UDP服务。但在发送或接收数据报时,内核会自动为之加上目地和源地址信息。8、Close()和shutdown()——结束数据传输
当所有的数据操作结束以后,你可以调用close()函数来释放该socket,从而停止在该socket上的任何数据操作:close(sockfd);
你也可以调用shutdown()函数来关闭该socket。该函数允许你只停止在某个方向上的数据传输,而一个方向上的数据传输继续进行。如你可以关闭某socket的写操作而允许继续在该socket上接受数据,直至读入所有数据。
int shutdown(int sockfd,int how);
Sockfd的含义是显而易见的,而参数 how可以设为下列值:
·0-------不允许继续接收数据
·1-------不允许继续发送数据
·2-------不允许继续发送和接收数据,均为允许则调用close ()
shutdown在操作成功时返回0,在出现错误时返回-1(并置相应errno)。
int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr * from int *fromlen)
int sendto(int sockfd,const void *msg,int len,unsigned int flags,struct sockaddr *to int tolen)
其中sockfd,buf,len的意义和read,write一样,分别表示套接字描述符,发送或接收的缓冲区及大小.
recvfrom负责从 sockfd接收数据,如果from不是NULL,那么在from里面存储了信息来源的情况,如果对信息的来源不感兴趣,可以将from和fromlen 设置为NULL.sendto负责向to发送信息.此时在to里面存储了收信息方的详细资料.
- 网络编程数据结构 及函数总结
- 网络编程数据结构 及函数总结
- 网络编程流程及函数总结
- 网络编程常用函数和数据结构
- linux网络编程--数据结构与函数原型
- linux 网络编程总结(之网络编程函数总结)
- WinPcap编程常用函数和数据结构总结
- WinPcap编程常用函数和数据结构总结
- LinuxC常用数据结构及函数总结
- 【总结】【Unix网络编程】前言及基础知识
- Linux socket 网络编程常用函数总结
- java网络编程基础函数总结
- MATLAB基本编程及常用函数总结
- FFmpeg学习2:解码数据结构及函数总结
- 网络编程TCP总结及实践-C语言
- 网络编程UDP总结及实践-C语言
- unix网络编程中一些常见的函数的总结
- linux网络编程中的pol和epolll函数总结
- 人生的转变
- Ajax实战 入手
- Ghost二十个鲜为人知的实用参数
- Why I can't keep on going?
- 【C++语言学习推荐书目】
- 网络编程数据结构 及函数总结
- 呵呵
- JMF捕获技术(音频)
- 使用DirectPlay
- 搭建JMF运行平台(Eclipse)
- 有利于成功的十个习惯(转)
- 工作了,以后写Apex的时间少了
- 使用VC6.0访问XML文件!
- 模拟退火算法