设为首页 加入收藏

TOP

网络编程基础之TCP编程学习(一)(一)
2019-09-30 16:44:59 】 浏览:43
Tags:网络编程 基础 TCP 编程 学习

 

网络编程基础了解

socket套接字

socket是一种通讯机制,它包含一整套的调用接口和数据结构的定义,他给应用程序提供了使用如TCP/UDP等网络通讯的手段。

linux中的网络编程通过socket接口实现,socket既是一种特殊的IO,提供对应的文件描述符。一个完整的socket都有一个相关描述{协议,本地地址,本地端口,远程地址,远程端口};每个socket有一个本地唯一Socket,由操作系统分配。

定位某个计算机用IP,定位某个服务用端口。

创建Socket

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

返回:成功返回描述符,出错返回-1

(详细可以利用 指令 man socket 查看)

参数解释

domain

  AF_INET    IPv4因特网域

  AF_INET6    IPv6因特网域

  AF_UNIX      unix

  AF_UNSPEC  未指定

protocol

  通常为0,表示按给定的域和套接字类型选择默认协议。

type(指定采用何种协议)

  SOCK_STREAM   采用TCP协议(流式的套接字可以提供可靠的面向连接的通信流)

  SOCK_DGRAM    采用UDP协议(数据报套接字)

  SOCK_RAW    主要用于新的网络协议实现的测试。

  SOCK_SEQPACKET 长度固定、有序、可靠的面向连接报文传递

  一般采用前两种方式。。。。。。。

 

字节序

字节序分为大端和小端字节序

大端字节序:高字节在前,低字节在后

小端字节序:低字节在前,高字节在后

 不同体系采用不同的字节序

网络字节序:在网络中使用的字节序称为网络字节序,采用大端字节序。

 

字节序的转换函数

网络传输的数据一定要统一顺序,所以需要字节序转换

uint32_t htonl(uint32_t hostlong); 将一个32位整数由主机(host)字节序转换成网络(network)字节序

uint16_t htons(uint16_t hostshort); 将一个16位整数由主机(host)字节序转换成网络(network)字节序

uint32_t ntohl(uint32_t netlong); 将一个32位整数由网络(network)字节序转换成主机(host)字节序

uint16_t ntohs(uint16_t netshort); 将一个16位整数由网络(network)字节序转换成主机(host)字节序

 

地址结构

通用地址结构

#include <sys/socket.h>

struct sockaddr{

  unsigned short sa_family;    //Internet地址族,AF_XXX

  char sa_data[14];      //14bytes的协议地址

}

//一般不用

 

因特网地址结构

struct in_addr{

  in_addr_t s_addr;    //ipv4地址

};

struct sockaddr_in{

  short int sin_family;      //Internet地址族如AF_INET(主机字节序)

  unsigned short int sin port;    //端口号,16位值(网络字节序)将数据转换之后赋值

  struct in_addr sin_addr;      //Internet地址,32ipv4地址(网络字节序)要将点分十进制转换成网络字节序,转化函数如下

  unsigned char sin_zero[8];    //0(为了格式对其的填充位)

};

 

点分十进制转、网络字节序转换函数

#include <arp/inet.h>//头文件

const char *inet_ntop(int domain, const void *restrict addr, char *restrict str, socklen_t size);

返回:成功返回地址字符串指针,出错返回NULL

功能:网络字节序转换成点分十进制 如:127.0.0.1

 

int inet_pton(int domain, const char *restrict str, void *restrict addr);

返回:成功返回1, 无效格式返回0, 出错返回-1

功能:点分十进制转换成网络字节序

(详情可利用指令 man inet_pton 查看函数)

参数

domain:Inter 地址族,如AF_INET

addr: Internet地址,32IPv4地址(网络字节序)

str:地址字符串(点分十进制)指针

size:地址字符串大小

 

案例

struct sockaddr_in sockin;    //定义一个结构体

char buff[16];

memset(&sockin, 0, sizeof(sockin));

sockin.sin_family = AF_INET;    //地址族

sockin.sin_port = htons((short)8888); //端口号,必须是网络字节序

//填充sin_addr 需要将点分十进制转换为网络字节序

if(inet_pton(AF_INET,"127.0.0.1",&sockin.sin_addr.s_addr) <= 0)

{

  //进行错误处理

}

printf("%s\n",inet_ntop(AF_INET, &sockin.sin_addr.s_addr, buff, sizeof(buff)));

 

TCP编程模

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇网络编程基础之TCP编程学习(一) 下一篇Centos8尝鲜

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目