#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include <sys/time.h>
#include <unistd.h>
using namespace std;
int main()
{
struct timeval end;
//1.创建一个socket
//创建套接字 命名为 socket_fd 当发生错误时返回-1,否则返回一个代表新分配的描述符的整数。socket(int domain,int type,int protocol)
int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (socket_fd == -1)
{
cout << "socket 创建失败: "<< endl;
exit(1);
}
//2.准备通讯地址(必须是服务器的)192.168.233.128是本机的IP
//结构体sockaddr_in结构体用来处理网络通信的地址
struct sockaddr_in addr;
addr.sin_family = AF_INET;//设置地址家族
addr.sin_port = htons(8888);//设置端口,将一个无符号短整型的主机数值转换为网络字节顺序,即大尾顺序(big-endian)
// htons 的作用是将端口号由主机字节序转换为网络字节序的整数值 1234 转换为 3412
addr.sin_addr.s_addr = inet_addr("192.168.75.128");//inet_addr方法可以转化字符串,主要用来将一个十进制的数转化为二进制的数,用途多于ipv4的IP转化。
// in_addr_t inet_addr(const char* strpr) 若字符串有效则将字符串转换为32位二进制网络字节序的IPV4地址,否则为INADDR-node
//3.bind()绑定 bind()为一个套接字分配地址。当使用socket()创建套接字后,只赋予其所用的协议,并未分配地址。
//在接受其他主机的连接前,必须先调用bind()为套接字分配一个地址。
//bind()有三个参数
// sockfd 表示使用bind函数的套接字描述符
// my_addr 指向sockaddr结构的指针
//addrlen 用socklen-t字段制定sockaddr结构的长度
// int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
//参数一:0的返回值(socket_fd)
//参数二:(struct sockaddr*)&addr 前面结构体,即地址
//参数三: addr结构体的长度
int res = bind(socket_fd,(struct sockaddr*)&addr,sizeof(addr));
if (res == -1)
{
cout << "bind创建失败: " << endl;
exit(-1);
}
cout << "bind ok 等待客户端的连接" << endl;
//4.监听客户端listen()函数
//参数二:进程上限,一般小于30
//当socket和一个地址绑定之后,listen()函数会开始监听可能的连接请求
listen(socket_fd,30);
//5.等待客户端的连接accept(),返回用于交互的socket描述符
struct sockaddr_in client;
socklen_t len = sizeof(client);
int fd = accept(socket_fd,(struct sockaddr*)&client,&len);
if (fd == -1)
{
cout << "accept错误\n" << endl;
exit(-1);
}
//6.使用第5步返回socket描述符,进行读写通信。
char *ip = inet_ntoa(client.sin_addr);
cout << "客户: 【" << ip << "】连接成功" << endl;
//write(fd, "welcome", 7);
char buffer[20]={};
int size = read(fd, buffer, sizeof(buffer));//通过fd与客户端联系在一起,返回接收到的字节数
//第一个参数:accept 返回的文件描述符
//第二个参数:存放读取的内容
//第三个参数:内容的大小
cout<<"receive msg"<<endl;
gettimeofday(&end,NULL);
cout<<"us: "<<end.tv_sec*1000000 + end.tv_usec<<endl;
cout<<"ms: "<<end.tv_sec*1000 + end.tv_usec/1000<<endl;
cout << "接收到字节数为: " << size << endl;
cout << "内容: " << buffer << endl;
char buffer2[20]={};
int size2 = read(fd, buffer2, sizeof(buffer2));//通过fd与客户端联系在一起,返回接收到的字节数
cout<<"receive msg2"<<endl;
gettimeofday(&end,NULL);
cout<<"us: "<<end.tv_sec*1000000 + end.tv_usec<<endl;
cout<<"ms: "<<end.tv_sec*1000 + end.tv_usec/1000<<endl;
cout << "接收到字节数为: " << size2 << endl;
cout << "内容: " << buffer2 << endl;
//7.关闭sockfd
close(fd);
close(socket_fd);
return 0;
}

LovG-Sco-Tec
- 粉丝: 179
最新资源
- Linux系统管理教学课件汇总完整版电子讲义(1).pptx
- 基于单片机设计步进电机的控制系统--课程设计(1).docx
- 国家开放大学电大专科《Windows网络操作系统管理》机考网考形考题库及答案(1).docx
- 云计算环境下的软件测试服务研究(1).docx
- 互联网+环境下提升艺术设计教师教育教学能力的研究(1).docx
- 互联网+时代下的智慧档案馆建设初探(1).docx
- 互联网+背景下企业财务共享平台的构建研究(1).docx
- 现代计算机网络原理ATM(1)(1).pptx
- 单片机双机通信系统-毕业论文设计(1)(1).doc
- 企业信息化项目监控的阶段管理(1).docx
- 南宁市信息化大楼工程建设项目可行性研究报告(1)(1).doc
- 房地产信息化相关项目投资计划书范本(1).docx
- 产业互联网发展潜力巨大-三方协同合作推动创新变革(1).docx
- 聚焦深度学习的初中英语阅读文本解读策略(1).docx
- (完整版)成都理工大学计算机网络试题2013-2014年第二学期试题(1).doc
- 大数据时代读书笔记(1).docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


