TCP编程函数和步骤

TCP编程的服务器端一般步骤是

1、创建一个socket,用函数socket();

2、设置socket属性,用函数setsockopt();*可选

3、绑定IP地址、端口等信息到socket上,用函数bind();

4、开启监听,用函数listen();

5、接收客户端上来的连接,用函数accept();

6、收发数据,用函数send()和recv(),者read()和write();

7、关闭网络连接;

8、关闭监听;

TCP编程的客户端一般步骤是:

1、创建一个socket,用函数socket();

2、设置socket属性,用函数setsockopt();*可选

3、绑定IP地址、端口等信息到socket上,用函数bind();*可选

4、设置要连接的对方的IP地址和端口等属性;

5、连接服务器,用函数connect();

6、收发数据,用函数send()和recv(),或者read()和write();

7、关闭网络连接;

UDP编程的服务器端一般步骤是:

1、创建一个socket,用函数socket();

2、设置socket属性,用函数setsockopt();*可选

3、绑定IP地址、端口等信息到socket上,用函数bind()

4、循环接收数据,用函数recvfrom();

5、关闭网络连接;

UDP编程的客户端一般步骤是:

1、创建一个socket,用函数socket();

2、设置socket属性,用函数setsockopt();*可选

3、绑定IP地址、端口等信息到socket上,用函数bind();*可选

4、设置对方的IP地址和端口等属性;

5、发送数据,用函数sendto();

6、关闭网络连接;

常用的网络命令:
netstat
命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是-an用来显示详细的网络状态.至于其它的选项我们可以使用帮助

telnet
telnet是一个用来远程控制的程序,但是我们完全可以用这个程序来调试我们的服务端程序的.比如我们的服务器程序在监听8888端口,我们可以用telnetlocalhost8888来查看服务端的状况

数据结构
1、地址结构
structsockaddr_in{
shortintsin_family;/*地址族一般为AF-INET*/
unsignedshortintsin_port;/*端口号*/
structin_addrsin_addr;/*IP地址*/
unsignedcharsin_zero[8];/*填充0以保持与structsockaddr同样大小使用memset()bzero()来填充*/
};

structsockaddr{
  unsignedshortsa_family;/*地址族,AF_xxx*/
 charsa_data[14];/*14字节的协议地址*/

};


2、DNS结构
structhostent{
char*h_name;/*主机的官方域名*/
char**h_aliases;/*一个以NULL结尾的主机别名数组*/
inth_addrtype;/*返回的地址类型,在Internet环境下为AF-INET*/
inth_length;/*地址的字节长度*/
char**h_addr_list;/*一个以0结尾的数组,包含该主机的所有地址*/
};

操作函数

1、socket:

创建socket描述符

intsocket(intdomain,inttype,intprotocol);
domain=AF_INETsocket的类型,typeSOCK_STREAMSOCK_DGRAM,分别表示TCP连接和UDP连接;protocol0

返回一个整型socket描述符。


2.bind: 

socket描述符与你本机上的一个端口相关联(仅用于服务器)

intbind(intsockfd,structsockaddr*my_addr,intaddrlen);

Sockfd是一个socket描述符
my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;
addrlen=sizeof(structsockaddr)
返回:成功=0;失败=-1errno=错误号。
可以用下面的赋值自动获得本机IP地址和随机获取一个没有被占用的端口号:
my_addr.sin_port=0;/*系统随机选择一个未被使用的端口号*/
my_addr.sin_addr.s_addr=INADDR_ANY;/*填入本机IP地址*/

3.Connect:

与远端服务器建立一个TCP连接(用于客户端)
intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);
Sockfd是目的服务器的sockt描述符
serv_addr是包含目的机IP地址和端口号的指针。
返回:成功=0;失败=-1errno=错误号。

4、Listen

监听是否有服务请求,用于bind()
intlisten(intsockfd,intbacklog);
Sockfd是Socket系统调用返回的socket描述符;
backlog指定在请求队列中允许的最大请求数,缺省值为20
返回:成功=0;失败=-1errno=错误号。

5.accept:

接受来自客户的请求
intaccept(intsockfd,void*addr,int*addrlen);
sockfd是被监听的socket描述符,
addr是指向sockaddr_in变量的指针,存放客户主机的信息;
addrten指向值为sizeof(structsockaddr_in)的整型指针变量。
返回:成功返回一个新的socket描述符,来供这个新连接来使用。错误发生时返回一个-1并且设置相应的errno值。

6.Send:

在连接(TCP)的socket方式下发送信息
intsend(intsockfd,constvoid*msg,intlen,intflags);
Sockfd是用来传输数据的socket描述符
msg是一个指向要发送数据的指针。
Len是以字节为单位的数据的长度。
flags一般情况下置为0

7.recv:

在连接(TCP)的socket方式下接收数据

intrecv(intsockfd,void*buf,intlen,unsignedintflags);
Sockfd是接受数据的socket描述符;
buf是存放接收数据的缓冲区;
len是缓冲的长度。
Flags也被置为0
返回:实际上接收的字节数,如果连接中止,返回0,。出现错误时,返回-1并置相应的errno值。

8.sendto:

在在无连接(UDP)socket方式下发送数据
intsendto(intsockfd,constvoid*msg,intlen,unsignedintflags,conststructsockaddr*to,inttolen);
to表示目地机的IP地址和端口号信息
tolen=sizeof(structsockaddr)。
返回:实际发送的数据字节长度或在出现发送错误时返回-1

9.Recvfrom()

在无连接(UDP)socket方式下接收数据
intrecvfrom(intsockfd,void*buf,intlen,unsignedintflags,structsockaddr*from,int*fromlen);
from保存源机的IP地址及端口号。
fromlen=sizeof(structsockaddr)
返回:实际存入from中的数据字节数。当出现错误时返回-1,并置相应的errno

10.close()

释放socket,停止任何数据操作
close(sockfd);

11.shutdown:

单向关闭连接
intshutdown(intsockfd,inthow);
how可以设为下列值:
·0-------不允许继续接收数据
·1-------不允许继续发送数据
·2-------不允许继续发送和接收数据,均为允许则调用close()
shutdown在操作成功时返回0,在出现错误时返回-1(并置相应errno)。

12.gethostbyname:

域名和IP地址的转换
structhostent*gethostbyname(constchar*name);

13.inet_pton函数:

将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。
intinet_pton(intfamily,constchar*strptr,void*addrptr); 

第一个参数可以是AF_INETAF_INET6:第二个参数是一个指向点分十进制串的指针:第三个参数是一个指向转换后的网络字节序的二进制值的指针。       
返回:1---成功   0---输入不是有效的表达格式   -1---失败

14.inet_ntop函数:

inet_pton函数正好相反,inet_ntop函数是将网络字节序二进制值转换成点分十进制串。
constchar*inet_ntop(intfamily,constvoid*addrptr,char*strptr,size_tlen); 

第一个参数可以是AF_INETAF_INET6:第二个参数是一个指向网络字节序的二进制值的指针;第三个参数是一个指向转换后的点分十进制串的指针;第四个参数是目标的大小,以免函数溢出其调用者的缓冲区。
返回:指向结果的指针---成功   NULL---失败


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值