Socket学习笔记(3)客户端

我的理解就是三次握手使用的函数帮助解决(函数内部完成),accept和connect
四次挥手应该就是close直接解决了。 因为在创建套接字的时候是定义的stream流式套接字,是面向连接的。所以就直接是在函数里解决握手与挥手了吧。
这里完全是自己的理解,如果有大佬能回应我会感激到哭

--------------------------------------------------------------------------------------

作为客户端需要知道的事情: 知道服务器的IP地址和端口号。
首先要建立连接
座位客户端,既不需要绑定也不需要监听,只需要连接就可以了。使用函数:

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

主动和服务器简历链接,如果成功才能传输数据。(相对于TCP协议。)成功返回0,失败返回其它的。
sockfd 套接字
addr 需要链接的服务器地址结构
addrlen 地址结构长度

int sockfd = 0;
ockfd = socket(AF_INET,OCK_STREAM,0);if(sockfd < 0){
	perror("socket");
	exit(-1);
}

int err_log = 0;// 存储错误
unsigned short port = 8000;//服务器端口
char * server_ip = "192.168.1.2"; // 服务器IP
struct sockaddr_in server_addr;

bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
inet_pton(AF_INET,server_ip,&server_addr.sin_addr); // 将点分十进制转换为32位数,存到server_addr.sin_addr
//主动链接服务器
err_log = connect(sockfd, (struct sockaddr *)&server_addr,sizeof(server_addr));
if(err_log != 0){
	perror("connect");
	close(sockfd);
	exit(-1);
}

因为套接字是一个文件描述符,所以使用read、write 可以直接从这个连接中取出或者写入数据。
但是系统提供了函数进行读写

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

用来发送数据。要注意的是不能用TCP协议发送0长度的数据包。
sockfd : socket套接字
buf : 待发送数据缓存区的地址(要发送的字符串)
nbytes:发送缓存区大小(以字节为单位)
flags : 标志位,通常为0
返回值为成功发送的字节数。

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

用来接收数据
sockfd : socket套接字
buf : 接收数据缓存区的地址(要接收的字符串)
nbytes:发送缓存区大小(以字节为单位)
flags : 标志位,通常为0
返回值为成功接收到的字节数。

while(1){
	char send_buf[512] = "";
	char recv_buf[512] = "";
	// 标准输入,使用键盘输入,因为是最后结束符,所以被替换成\0无关紧要
	fget(send_buf, sizeof(send_buf),stdin); 
	send_buf[strlen(send_buf)-1] = '\0';    // 结束
	
	/***********************不建议使用******************/

	/*//向sockfd发送数据大小为strlen(send_buf)的数据
	write(sockfd ,send_buf ,strlen(send_buf)); 
	//从sockfd中读取数据写入到recv_buf中
	read(sockfd, recv_buf,sizeof(recv_buf));*/    
	/***************************************************/
	recv(sockfd,send_buf,sizeof(send_buf),0);
	send(sockfd,recv_buf,sizeof(recv_buf),0);
}
close(sockfd);

使用close函数就可以关闭套接字。

关闭一个代表着已连接(accept)套接字会导致另一端(客户端)收到一个长度为0的数据包。

  • 对于服务器来说,关闭socket创建的监听套接字导致服务器无法进行监听,但是不会影响已经建立的链接。
  • 对于服务器来说,关闭accept简历的套接字会导致他所代表的链接被关闭了,但是不会影响服务器的监听。
  • 对于客户端来说,关闭连接就是关闭连接了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值