网络编程数据结构 及函数总结

原创 2006年06月07日 21:12:00

 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网络编程基础之二--UDP --Unix学习总结之四

Linux网络编程基础之二--UDP    我们在Linux网络编程基础之一里说了流socket和数据报socket的联系和区别。我们在这里简单说一下基于UDP协议的网络编程。    两个常用的函数 ...
  • mayo
  • mayo
  • 2006年04月04日 17:45
  • 1503

linux网络编程--数据结构与函数原型

套接字有三种类型:流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM)及原始套接字。 socket()    |  bind()    |                    ...

最简洁完整的Java高级教程之一(数据结构、集合、网络编程、多线程)

最简洁完整的Java高级教程(数据结构、集合、序列化、网络编程、邮件,多线程,Applet基础)...
  • Ants_2
  • Ants_2
  • 2017年03月12日 19:26
  • 175

最简洁完整的Java高级教程之二(数据结构、集合、网络编程、多线程)

最简洁完整的Java高级教程(数据结构、集合、序列化、网络编程、邮件,多线程,Applet基础)...
  • Ants_2
  • Ants_2
  • 2017年03月12日 21:55
  • 139

网络编程头文件与数据结构

网络编程头文件与数据结构  2009-09-07 13:56:21|  分类: 网络编程 |  标签: |字号大中小 订阅 今天需要解决的问题是,获取网卡的...
  • VMA_LMA
  • VMA_LMA
  • 2013年05月24日 09:38
  • 3279

C++ 网络编程 数据结构 面试题罗列

在这里有我自己的面试问题,还有网上收集的。 1. connect方法会阻塞,请问有什么方法可以避免其长时间阻塞? 2. 网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻知道? 3...

C/C++ 网络编程: 各类协议数据结构

宏定义 一些宏定义 #define EPT_IP 0x0800 /* type: IP */ #define EPT_ARP 0x0806 /* type: ARP...

Unix网络编程之常见的数据结构

在Unix/Linux网络编程中,会涉及到很多的数据结构,下面来总结一下: IPv4相关结构: struct in_addr {     in_addr_t         s_addr;  //表...

(四十八)socket编程——引入、网络字节序、IP地址转换函数、sockaddr数据结构

一、什么是socket  socket这个词可以表示很多概念:   在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:网络编程数据结构 及函数总结
举报原因:
原因补充:

(最多只允许输入30个字)