【转】Linux C 网络编程——TCP套接口编程

地址:http://blog.csdn.net/matrix_laboratory/article/details/13669211

2. socket()

[cpp] view plaincopy

  1. <span style="font-size:14px">int socket(int domain, int type, int protocol);</span>

socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调用出错则返回-1。
(1)domain:
AF_INET:IPv4
AF_INET6: ipv6
AF_UNIX:非网络环境
AF_UNSPIC:undefined
(2)type

SOCK_STREAM:创建TCP流套接字

SOCK_DGRAM:创建UDP数据报套接字

SOCK_RAW:创建原始套接字

(3)protocol:指定某个协议的特定类型
参数protocol通常设置为0,表示通过参数domain指定的协议族和参数type指定的套接字类型来确定使用的协议。
(4)返回值
执行成功后返回一个新创建的套接字;若有错误发生则返回一个-1,错误代码存入errno中。

3. bind()

int bind(int sockfd,struct sockaddr *my_addr,socklen_t addrlen)

函数bind()的作用是将一个套接字文件描述符与地址和端口绑定。

(1)sockfd:

sockfd是调用socket函数返回的文件描述符;

(2)addrlen

sockaddr结构的长度。

(3)my_addr

一个指向sockaddr结构的指针,它保存着本地套接字的地址(即端口和IP地址)信息。不过由于系统兼容性的问题,一般不使用这个结构,而使用另外一个结构(structsockaddr_in)来代替

(4)return

函数成功后返回0,当有错误发生时则返回-1,错误代码存入errno中。

[cpp] view plaincopy

  1. struct sockaddr_in addr_serv,addr_client;/*本地的地址信息*/
  2. memset(&serv_addr,0,sizeof(structsockaddr_in));
  3. addr_serv.sin_family= AF_INET;/*协议族*/
  4. addr_serv.sin_port= htons(SERV_PORT);/*本地端口号*/
  5. addr_serv.sin_addr.s_addr= htonl(INADDR_ANY); /*任意本地地址*/
  6. /*套接字绑定*/
  7. if(bind(sock_fd,(structsockaddr *)&addr_serv),sizeof(struct sockaddr_in)) <0)
  8. {
  9. perror(“bind”);
  10. exit(1);
  11. }

4. listen()

int listen(int sockfd,int list_size);

用来初始化服务器可连接队列,服务器处理客户端连接请求的时候是顺序处理的,同一时间仅能处理一个客户端连接。当多个客户端的连接请求同时到来的时候,服务器并不是同时处理,而是将不能处理的客户端连接请求放到等待队列中,这个队列的长度由listen()函数来定义。

(1)sockfd

sockfd是调用socket函数返回的文件描述符

(2)list_size

指定该连接队列的最大长度。如果连接队列已经达到最大,之后的连接请求被服务器拒绝。大多数系统的设置为20,可以将其设置修改为5或者10,根据系统可承受负载或者应用程序的需求来确定。

(3)return

当listen()函数成功运行时,返回值为0;当运行失败时,它的返回值为-1,错误代码存入errno中。

5. accept()

#include<sys/types.h>

#include<sys/socket.h>

int accept(int sock_fd,struct sockaddr*addr,socklen_t *addrlen)

3次握手完成后,server会调用accept()接受一个链接请求。

如果在调用此函数之前,没有链接请求就会把进程阻塞,等待链接sock_fd:建立套接字时返回的套接字文件描述符,调用socket()返回的。

(1)sock_fd

是由函数socket创建,经函数bind绑定到本地某一端口上,然后通过函数listen转化而来的监听套接字。

(2)addr

用来保存客户端的地址和端口。

注:返回参数

(3)addrlen

入:addr缓冲区的大小。

出:addr 所指向的结构体的大小。

(4) return

accept()函数的返回值是新连接的客户端套接字文件描述符,与客户端之间的通信是通过accept()返回的新套接字文件描述符来进行的,而不是通过建立套接字时的文件描述符。如果accept()函数发生错误,accept()会返回-1,通过errno可以得到错误值。

(5)如果参数sock_fd所指定的套接字被设置为阻塞方式(Linux下的默认方式),且连接请求队列为空,则accept()将被阻塞直到有连接请求到此为止;如果参数s所指定的套接字被设置为非阻塞方式,如果队列为空,accept将立即返回-1,errno被设置为EAGAIN.

6. connect()

#include<sys/types.h>

#include<sys/socket.h>

int connect(int sock_fd,struct sockaddr  *serv_addr,socklen_taddrlen);

TCP:则connect()函数用于服务器发出连接请求,服务器的IP地址和端口号由 参数serv_addr指定。

UDP:则connect函数并不建立真正的连接,它只是告诉内核与该套接字进行通信的目的地址(由第二个参数指定),只有该目的地址发来的数据才会被该socket接收。调用connect函数的好处是不必在每次发送和接收数据时都指定目的地址。

(1)serv_addr

是一个指向数据结构sockaddr的指针,其中包括客户端需要连接的服务器的目的IP地址和端口号。

(2)addrlen

表示了第二了参数的大小,可以使用sizeof(struct sockaddr)

(3)return

执行成功后返回0,有错误发生则返回-1,错误代码存入errno中。

7. send()

#include<sys/types.h>

#include<sys/socket.h>

ssize_t send(int conn_fd,const void *buf,size_t len, int flags);

函数send用来在TCP套接字上发送数据,send只能对处于连接状态的套接字使用。

(1)conn_fd

为已建立好连接的套接字描述符,即调用accept()函数后返回的套接字描述符。

(2)buf

存放发送数据的缓冲区。

(3)len

发送缓冲区的长度

(4)flags

为控制选项,一般设置为0,或取以下值:

  • MSG_OOB:在指定的套接字上发送带外数据(out-of-band data),该类型的套接字必须支持带外数据(如:SOCK_STREAM).
  • MSG_DONTROUTE:通过最直接的路径发送数据,而忽略下层协议的路由设置。

(5)return

执行成功返回实际发送数据的字节数,出错则返回-1,错误代码存入errno中。

执行成功只是说明数据写入套接字的缓冲区中,并不表示数据已经成功地通过网络发送到目的地。

8. recv() 接收数据

#include<sys/types.h>

#include<sys/socket.h>

ssize_t recv(int conn_fd,void *buf,size_t len,int flags)

recv()用来TCP套接字上接收数据。函数recv从指定的套接字描述符上接收数据并保存到指定buf中

(1)conn_fd

为已建立好连接的套接字描述符,即调用accept()函数后返回的套接字描述符

(2)buf

接收缓冲区

(3)len

接收缓冲区的大小

(4)flags

为控制选项,一般设置为0或取以下数值

  • MSG_OOB:请求接收带外数据
  • MSG_PEEK:只查看数据而不读出
  • MSG_WAITALL:只在接收缓冲区满时才返回。

(5)return

函数执行成功返回接收到的数据字节数,出错返回-1,错误代码存入errno中。

时间: 2024-11-05 16:27:53

【转】Linux C 网络编程——TCP套接口编程的相关文章

C网络编程-TCP套接口编程

只有几个基本的示例如下 建立服务端的绑定监听等过程的函数 1 #include<sys/types.h> 2 #include<sys/socket.h> 3 4 #include<netinet/in.h> 5 #include<arpa/inet.h> 6 #include<unistd.h> 7 8 #include<stdio.h> 9 #include<stdlib.h> 10 11 #include<st

值得收藏的TCP套接口编程文章

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由jackieluo发表于云+社区专栏 TCP客户端-服务器典型事件 下图是TCP客户端与服务器之间交互的一系列典型事件时间表: 首先启动服务器,等待客户端连接 启动客户端,连接到服务器 客户端发送一个请求给服务器,服务器处理请求,响应客户端 循环步骤3 客户端给服务器发一个文件结束符,关闭客户端连接 服务器也关闭连接 基本TCP客户-服务器程序的套接口函数 套接口编程基本函数 socket 函数 为了执行网络I/O,一个进程(无论

UNPv1第四章:基本TCP套接口编程

1 socket函数 为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型 #include <sys/socket.h> int socket (int family, int type, int protocol); //返回:若成功则为非负描述符,若出错则为-1 其中family指明协议族,type参数指明套接字类型,protocol参数应该设为某个(见下图)协议类型常值,或者设为0,以选择所给定family和type组合的系统默认值 socket

unix网络编程之基本套接口编程

第一章  套接口编程简介 IPv4套接口地址:"网际套接口地址结构" 通用套接口地址结构: 套接口函数被定义为采用指向通用套接口地址结构的指针,这要求对这些函数的任何调用都必须将指向特定于协议的套接口地址结构的指针类型转换成指向通用套接口地址结构的指针: 套接口地址结构的比较: 值-结果参数: 当把套接口地址结构传递给套接口函数时,总是通过指针来传递的,即传递的是一个指向结构的指针. 1, 从进程到内核传递套接口地址结构有3个函数:bind.connect.sendto,这3个函数的一

Linux之网络基础TCP/IP以及网络属性配置

计算机网络区域范围: 局域网络 (Local Area Network, LAN):节点之间的传输距离较近 广域网 (Wide Area Network, WAN):传输距离较远,网络应用方面大多为类似 email, FTP, WWW 浏览等功能 计算机网络协议:网络连接过程分成数个阶层 (layer),每个阶层都有特别的独立的功能,不会互相干扰的. 目前的OSI七层协定(Open System Interconnection) OSI模型自上而下,分为以下: 应用层:文件传输,电子邮件,文件服

套接口编程简介

1.套接口地址结构 POSIX规范只需要结构中的三个成员:sin_family.sin_addr.sin_port.其中sin_addr又是一个结构 2.通用套接口地址结构 套接口函数被定义为采用指向通用套接口地址结构的指针.由于套接口函数的定义并没有使用void*指针类型, 所以调用套接口函数时必须进行强制类型转换. 使用通用套接口地址结构的原因:内核必须依据通用套接口地址结,检查sin_family的值来确定结构的类型 3.字节排序函数 多字节数据在内存中存储有两种方法.小端字节序把低字节存

Python网络编程—TCP套接字之HTTP传输

HTTP协议 (超文本传输协议) 1.用途 : 网页获取,数据的传输 2.特点: 应用层协议,传输层使用tcp传输 简单,灵活,很多语言都有HTTP专门接口 无状态,协议不记录传输内容 http1.1 支持持久连接,丰富了请求类型 3.网页请求过程 客户端(浏览器)通过tcp传输,发送http请求给服务端 服务端接收到http请求后进行解析 服务端处理请求内容,组织响应内容 服务端将响应内容以http响应格式发送给浏览器 浏览器接收到响应内容,解析展示 HTTP请求(request) 1.请求行

网络 基于TCP协议socket编程

一.socket编程         1.socket编程        socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端号"唯一标识网络通讯中的一个进程,"IP地址+端口号"就称为socket.在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成 的socket pair就唯一标识一个连接. socket本义有"插座"的意思,因此用来描述网络连接的一对一关系.    

基本套接口编程中的函数(自用)

uint16_t htons(uint16_t host16bitvalue); uint32_t htonl(uint32_t host32bitvalue); //均返回:网络字节序值 uint16_t ntohs(uint16_t host16bitvalue); uint32_t ntohl(uint32_t host32bitvalue); //均返回:主机字节序值 int inet_aton(const char *string, struct in_addr*addr); //将一