【Linux篇】Socket编程步骤

Socket编程理解

 一、服务端

1.创建套接字:socket()

#include <sys/types.h>         
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
 
参数:
domain:  地址族,常用有AF_INET和AF_INET6,分别代表IPv4和IPv6
type:    套接字类型,常用SOCK_STREAM(流格式套接字/面向连接的TCP套接字), 
          SOCK_DGRAM(数据报套接字/无连接的UDP套接字)
protocol:默认写0,宏:IPPROTO_TCP,IPPROTO_UDP,分别代表TCP和UDP协议
 
int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);  创建TCP套接字
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);   创建UDP套接字

2.为套接字添加信息(IP地址和端口号):bind()

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
 
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
 
参数:
int sockfd:                    是socket描述符
const struct sockaddr *addr:   是一个结构体指针
socklen_t addrlen:             是第二个参数,结构体指针的大小,一般用sizeof()就可以搞定
 
addr结构体的原型是:
struct sockaddr_in {
               sa_family_t      sin_family;    协议族
               in_port_t        sin_port;     端口号
               struct in_addr   sin_addr;     IP地址结构体
               unsigned char    sin_zero[8];  填充,没有实际意义,只是为跟sockaddr结构在内存 
                                              中对齐,这样两者才能相互转换
};

•地址转换API

•把字符串形式的"192.168.1.123"转为网络能识别的格式
int inet_aton(const char* straddr,struct in_addr* addrp);
 
const char* straddr:       字符串
struct in_addr* addrp:     一个结构体,IP地址
 
•把网络格式的IP地址转为字符串形式
char* inet_ntoa(struct in_addr inaddr);
 
struct in_addr inaddr:     一个结构体,IP地址

3.监听网络连接:listen()

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int listen(int sockfd, int backlog);
 
参数:
int sockfd:   socket的描述符
int backlog:  同时允许几路客户端和服务器进行正在连接的过程(正在三次握手)

4.监听到有客户端接入,开始接收连接:accept()

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
 
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
 
参数:
int sockfd:              socket描述符
struct sockaddr *addr:   客户端的协议地址,一个结构体,如果不关心,写NULL
socklen_t *addrlen:      客户端地址长度,如果不关心,写NULL

5.数据收发

TCP数据收发常用第一套API
ssize_t write(int fd, const void *buf, size_t count);  
ssize_t read(int fd, void *buf, size_t count);         
 
TCP数据收发常用第二套API:有连接
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
 

二、客户端

1.创建套接字:socket()

#include <sys/types.h>         
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
 
参数:
domain:  地址族,常用有AF_INET和AF_INET6,分别代表IPv4和IPv6
type:    套接字类型,常用SOCK_STREAM(流格式套接字/面向连接的TCP套接字), 
          SOCK_DGRAM(数据报套接字/无连接的UDP套接字)
protocol:默认写0,宏:IPPROTO_TCP,IPPROTO_UDP,分别代表TCP和UDP协议
 
int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);  创建TCP套接字
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);   创建UDP套接字

2.连接服务器:connect()

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

参数: 
int sockfd:                    客户端的socket描述符
const struct sockaddr *addr:   客户端服务器的IP地址和端口号,一个结构体
socklen_t addrlen:             是第二个参数,结构体指针的大小,一般用sizeof()就可以搞定

 3.数据收发

TCP数据收发常用第一套API
ssize_t write(int fd, const void *buf, size_t count);  
ssize_t read(int fd, void *buf, size_t count);         
 
TCP数据收发常用第二套API:有连接
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序猿gao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值