网络编程---TCP通信(代码实现)

说明

在系统编程中,通信的方式有消息队列,共享内存,信号量,管道,信号。但是他们的特点都是只能在同一台主机上通信,不能跨平台。而TCP和UDP通信可以实现不同电脑的通信,在局域网内通信时不需要服务器,但是想要通过网络与不在局域网内的通信那就需要云服务器了。

TCP-服务器

1、建立套接字

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

函数作用

        建立套接字,返回套接字文件描述符

函数参数

        domain : 你要选择 哪一种 地址族

                PF_INET / AF_INET Ipv4 网络协议

                PF_INET6/AF_INET6 Ipv6 网络协议

        type: 你 要选择 哪一种 协议

                SOCK_STREAM 选择TCP ----流式 套接字

                SOCK_DGRAM 选择UDP ----数据报套接字

               protocol : 传0表示使用默认协议

返回值

        成功返回 套接字文件描述符 sockfd

        失败返回 -1

2、绑定自己的IP

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

作用:

        进程绑定自己的IP地址 和 端口号

参数

        sockfd : 套接字文件描述符

        addr : 自己的IP地址和端口号

        addrlen : 地址的大小长度(地址族 端口号 IP地址 共8字节)

struct sockaddr      ---旧的结构体
{
    unsigned short int sa_family;   ---IP地址   端口号  、  协议
    unsigned char sa_data[14];
};
IPV4结构体--新结构体(新结构体中少了8个字节,实际使用过程,需要填充满16字体)
struct sockaddr_in
{
    sa_family_t  sin_family; /地址族    IPV4    IPV6/
    unsigned short sin_port; /端口号/
    struct in_addr sin_addr; /IP地址/
};
struct in_addr {
    in_addr_t s_addr; /in_addr_t为 32位的unsigned int,该无符号整数采用大端字节序。/
};

比如:初始化 IP地址 和端口号 --IPV4

struct sockaddr_in   serverAddr;
serverAddr.sin_family = PF_INET ; //AF_INET
serverAddr.sin_port =   htons (50000)  ;  //    host   to    network   short 服务器进程端口号
serverAddr.sin_addr.s_addr =  inet_addr("192.168.1.120");   //服务器IP地址
connect(sockfd, (struct sockaddr * )&serverAddr, sizeof(struct sockaddr_in) );

3、监听

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);

作用

        创建一个未连接队列 ,同时最多连接的客户端总数 backlog

参数

        sockfd : 套接字文件描述符

        backlog :同时最多支持连接上来的客户端总数

返回值

        成功返回 0

        失败返回 -1

4、等待客户端连接

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

作用

        等待客户端的连接

参数

        sockfd: 套接字文件描述符

        addr : 连接上来的客户端的IP地址和端口号

        addrlen : 长度

//如果客户端连接上来了,可以获取到连接上来的客户端的IP地址和端口号

返回值:

        成功返回 已连接的套接字文件描述符(使用这个套接进行通信)

        失败:-1

5、接收数据

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);

参数

        sockfd: 已连接的套接字文件描述符 connectfd

        buf : 接收到的数据存储到这里

        len : 接收数据的大小

        flags : 一般设置为 0

返回值:

        成功返回 接收到的字节数

        失败返回 -1

返回 0 表示客户端断开连接

6、发送数据

#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);

作用

        用于网络中发送数据

参数

        sockfd: 套接字文件描述符

        buf : 你要发送的数据

        len : 你要发送数据的大小 ,以 字节为单位

        flags : 一般默认为 0

返回值

        成功返回发送的字节数

        失败返回 -1

TCP客户端

客户端和服务器之间的区别:

2、发起连接

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

函数参数

        sockfd --> 套接字文件描述符

        addr ---对方的IP地址 和 端口号(进程端口)

        addrlen ---地址的长度 sizeof(struct sockaddr_in )

返回值

        成功:0

        失败:-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值