通过socket套接字,完成TCP/IP通信

面向连接的C/S 模型框图

 

创建一个TCP类型的套接字:

socket() 函数用来创建一个套接字,可以在shell 下输入 “man socket”获得函数原型
 

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

参数domain 用于指定创建套接字所使用的协议族,在linux/socket.h中定义,常用的有

  • AF_UNIX:创建一个只在本机内进行通信的套接字;
  • AF_INET:使用IPV4,TCP/IP协议;
  • AD_INET6:使用IPV6,TCP/IP协议;

 

参数type指定套接字的类型:

  • SOCK_STREAM:创建TCP流套接字;
  • SOCK_DGRAM:创建UDP数据报套接字;
  • SOCK_RAW:创建原始套接字;

 

参数protocol通常设置为0;

 

函数的一般实现为:

int socketfd;
socketfd = socket(AF_INET,SOCK_STREAM,0);
if(socketfd < 0){
    perror("socket\n");
    exit(1);    
}

 

绑定套接字:

函数bind用来将一个套接字和某个端口绑定在一起,函数原型为

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

int bind(int socketfd,struct sockaddr* serv_addr,socklen_t addrlen);

 

一般的实现方式为:

struct sockaddr_in serv_addr;
memset(serv_addr,0,sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(80);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

if(bind(socketfd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr_in)) < 0){
    perror("bind\n");
    exit(1);
}

 

建立连接:

connect函数原型:

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

 

实现方式:

struct sockaddr_in serv_addr;
memset(serv_addr,0,sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(80);
if(inet_pton(AF_INET,argv[1],&serv_addr.sin_addr) <0)
{//通过键入的点分十进制IP地址转换到二进制整肃
    printf("inet_pton\n");
    exit(1);
}

 

 

在套接字上监听:

listen 函数原型为:

#include <sys/socket.h>
int listen(int s,int backing);

参数backlog指定了该连接队列的最大长度,如果连接队列已经达到最大,之后的连接请求将被拒绝。

 

实现方式为:

#define LISTEN_NUM 12

if(listen(socketfd,LISTEN_NUM) < 0){
    perror("listen\n");
    exit(1);
}

 

接受连接:

函数accept 用来接受一个连接请求,该函数原型为

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

 

实现的方式:

int accept_fd;

accept_fd = accept(socketfd,(struct sockaddr*)NULL,NULL);
if(accept_fd < 0){
    printf("accept\n");
    exit(1);
}

 

发送数据:

send函数原型为:

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

 

send函数只能在建立连接的套接字使用,参数int s 为accept 函数的返回值; len 为发送数据的长度;flag 默认为0;

 

实现方式:

char sendbuff[1024];

if(send(accept_fd,sendbuff,len,0) < 0){
    printf("send\n");
    exit(1);
}

 

接受数据:

recv函数原型:

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

 

实现方式:

char recv[1024];

if(recv(accept_fd,recv,len,0) < 0){
    printf("send\n");
    exit(1);
}

 

错误代码都会存入 errno中,可以strerror(errno) 查看

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值