编写TCP的服务器与客户端

  1. 服务器

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

功能:创建并打开套接字。

头文件:#include <sys/types.h>

#include <sys/socket.h>

参数1:地址族。(AF == PF

PF_INET:internet协议。

PF_UNIT:unix internal协议。

PF_NS:Xerox NS协议。

PF_IMPLNK:Interface Message协议。

参数2:套接字类型。

SOCK_STREAM:流式套接字。(TCP)

SOCK_DGRAM:数据报套接字。(UDP)

SOCK_RAM:原始套接字。

参数3:参数通常置为0。

返回值:成功返回文件描述符。

失败返回-1。

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

功能:将主机的IP地址和进程的端口号绑定到套接字上。

头文件:#include <sys/types.h>

#include <sys/socket.h>

参数1:调用创建好的套接字的文件描述符。

参数2:结构体,在结构体里指定IP地址和端口号的地址

参数3:结构体的长度。

返回值:成功返回0。

失败返回-1。

参数2中的结构体:struct sockaddr

{

u_short sa_family;//地址族

char sa_data[14];//14字节协议地址

};

该结构体没有想要的成员,所以不用它,用别的结构体,要将别的结构体类型强制转换成该结构体类型。struct sockaddr *)&别的结构体名

想要的结构体:struct sockaddr_in//共14字节

{

u_short sin_family;//地址族  2字节

u_short sin_port;//端口号  2字节

struct in_addr sin_addr;//IPv4地址,结构体  4字节

char sin_zero[8];//作为填充  8字节

};

端口号要把主机字节序转化成网络字节序:u_short htons(u_short short);

如果端口号使用main函数传参,要将char类型转化为int类型:atoi(端口号)。

将服务器IPv4地址设置成为(0.0.0.0)时,会自动转化为自己主机的IP地址,具有可移植性

想要结构体中的结构体:struct in_addr

{

in_addr_t s_addr;//IP地址

};

要把十进制IP地址转换成二进制:in_addr_t inet_addr(const char *strptr);

int listen(int sockfd, int backlog);

功能:创建监听套接字,用来连接客户端。

头文件:#include <sys/types.h>

#include <sys/socket.h>

参数1:监听套接字的文件描述符。

参数2:服务端在同一时间能处理的最大客户端连接请求数量。

返回值:成功返回0。

失败返回-1。

int accept(int sockfd, const struct sockaddr *addr,socklen_t *addrlen);

功能:等待客户端请求并建立连接。

头文件:#include <sys/types.h>

#include <sys/socket.h>

参数1:监听套接字的文件描述符。

参数2:客户端的地址信息。如果不需要去获取地址信息,设置为NULL。

参数3:获取的地址长度。

返回值:成功返回新建的连接套接字描述符。

失败返回-1。

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

功能:接收客户端发来的数据。

头文件:#include <sys/types.h>

#include <sys/socket.h>

参数1:连接套接字的文件描述符。

参数2:申请到空间的首地址。

参数3:接收信息的字节长度。

参数4:接收方式(一般为0,阻塞方式,直到收到信息)。

返回值:成功返回接收到的字节数。

失败返回-1。

客户端退出返回0。

int close(int fd);

功能:关闭套接字。

头文件:#include <unistd.h>

参数1:想要关闭套接字的文件描述符。

  1. 客户端

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

功能:创建并打开套接字。

头文件:#include <sys/types.h>

#include <sys/socket.h>

参数1:地址族。(AF == PF

PF_INET:internet协议。

PF_UNIT:unix internal协议。

PF_NS:Xerox NS协议。

PF_IMPLNK:Interface Message协议。

参数2:套接字类型。

SOCK_STREAM:流式套接字。

SOCK_DGRAM:数据报套接字。

SOCK_RAM:原始套接字。

参数3:参数通常置为0。

返回值:成功返回文件描述符。

失败返回-1。

int connect(int sockfd,struct sockaddr *serv_addr,int addrlen);

功能:按照服务器的端口号和IP地址连接服务器。

头文件:#include <sys/types.h>

#include <sys/socket.h>

参数1:调用创建好的套接字的文件描述符。

参数2:目标服务器的地址信息。(结构体:地址族,端口号,IPv4地址)

参数3:数据结构的长度。

返回值:成功返回0。

失败返回-1。

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

功能:向目标IPv4地址发送消息。

头文件:#include <sys/types.h>

#include <sys/socket.h>

参数1:调用创建好的套接字的文件描述符。

参数2:申请到空间的首地址。

参数3:发送信息的字节长度。

参数4:发送方式(一般为0,阻塞方式,直到发送信息)。

返回值:成功返回接收到的字节数。

失败返回-1。

int close(int fd);

功能:关闭套接字。

头文件:#include <unistd.h>

参数1:想要关闭套接字的文件描述符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追求~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值