Network Programming(三)
实例 一
Application client/serveur TCP
A和B通信,A向B发送message,B收到后,将这个msg在print出来
A是客户端,B是serveur
1 | 程序A |
1 | 程序B |
客户端编程思路:
- 创建socket:int socket(int 协议簇,int 服务类型,int 协议 ), 返回对应该socket的文件描述符,失败,返回-1
- 建立连接:int connect(int 用于连接的socket ,struct sockaddr* 服务器的地址结构, socklen_t addr的大小),返回0,成功连接,否则-1
- 在循环中本地通过scanf输入msg,再发送msg:ssize_t send(int 已经连接的socket和connect中的一样,const void* 待发送的信息这里是字符串指针,size_t strlen(message), int 特殊选项一般为0 ),成功,返回传送的字节数,失败,-1
- 同样在这个循环中,跟在send后,接受server的回复:ssize_t recv()和send差不多
- 断开连接:close(socket);
服务器编程思路:
- 创建socket:int socket(int 协议簇,int 服务类型,int 协议 ), 返回对应该socket的文件描述符,失败,返回-1
1.5 设置socket:int setsockopt(int 要设置的socket,int 选项所在协议层,int 需要访问的选项名,const void* 指向选项值的指针,socklen_t 选项的长度); 返回-1,设置失败 - 绑定地址:int bind(int 创建出来的socket,struct sockaddr* 自己设定好的地址,socklen_t len,地址长度sizeof)返回0,success。返回-1,error
- 开始监听:int listen(int 用于监听的socket,int 主动参与者数量)。0正在监听,-1 error
- 接受连接:int accept(int 用于监听的socket,struct sockaddr 主动参与者的地址通过应用传递在return语句之后被填充,socklent_t 地址长度),返回客户端的socket,-1 error
- 在循环中不停接受来自客户端的message,recv()同客户端一样
- 处理接收到的数据,这里就是输出
- 把message送回给client write(client_sock,client_message,read_size);
- 断开连接:close(socket);
实例二
Programme client HTTP
编写一个客户端程序,向指定网站发送请求并获取数据
1 | #include <stdio.h> |
主机名和地址转换功能
- struct hostent gethostbyname(const char hostname);
把DNS主机名变成IP地址(使用DNS) - strcut hostent gethostbyaddr(const char addr,size_t len,int family);
把IP地址变成DNS主机名 - char* inet_ntoa(struct in_addr invader);
将IP地址转换为ASCII点十进制符号 - in_addr_t inet_addr(const char* strptr);
将点分十进制变成IP地址,-1 failure,不能用于广播(255.255.255.2555) - int inet_aton(const char* sttrptr,struct in_addr inaddr);
将点十进制表示法转换为IP地址;成功返回1,失败返回0 - int inet_pton(int af,const char src, void dst);
将IPv4和IPv6地址从文本转换为二进制形式 - const char inet_ntop(int af,const void src,char* dst,socklen_t size);
将IPv4和IPv6地址从二进制转换为文本形式
其他一些有用函数
- void bzero(void* s,size_t n);
将区域的前n个字节设置为从零开始 - void memset(void s,int c,size_t n);
用常量字节c填充指向的存储区的前n个字节
返回指向内存区域s的指针 - void memcpy(void dest,const void* src,size_t n);
将n个字节从内存区域src复制到内存区域dest。内存区域不能重叠