一、socket网络编程
实现一个简单的socket连接,来尝试一下linux网络编程吧。
首先分为服务端和客户端两个部分:
1、server服务端流程:
(1)socket(),创建套接字,返回int类型,可以看作连接通道的id,linux下一切皆文件,所以此处就是文件描述符。
(2)bind(),给此文件描述符绑定一个本地地址。
(3)listen(),监听连接请求
(4)accept(),接收连接请求,建立连接
(5)read()/ write(),数据读取/传输,此处为服务器发送也就是write
(6)close(),断开连接
2、client客户端流程:
(1)socket(),创建套接字,同上
(2)connect(),请求连接
(3)read () / write () ,数据读取/传输,此处为客户端接收也就是read
(4)close(),断开连接
先来看看服务端整体代码吧:
#include <string.h> //string
#include <unistd.h> //read(),write(),close()
#include <arpa/inet.h> //网络编程库,htonl(),htons()
#include <sys/socket.h> //网络编程库,socket(),bind(),listen(),sockaddr_in等
#include <iostream> //输入输出
#include <stdlib.h> //exit(),atoi()
using namespace std;
int main(int argc, char* argv[])
{
int serv_sock; //服务器套接字描述符
int clnt_sock; //客户端套接字描述符,同上,以下类似的就不重复了
struct sockaddr_in serv_addr; //地址信息结构体
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size; //accept()的第三个参数是socklen_t类型,表示长度
string message = "Hello World!";
if (argc != 2) { //如果命令行不是输入两个参数
cout<<"Usage : "<<argv[0]<<" <port>"<<endl;
exit(1);
}
//1.1. 调用socket()创建套接字
serv_sock = socket(PF_INET, SOCK_STREAM, 0); //文件描述符
if (serv_sock == -1)
cout << "socket() error" << endl;
//地址初始化
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //host类型转成long int
serv_addr.sin_port = htons(atoi(argv[1]));
//host类型转成short int,atoi是字符串转成整型数
//1.2. 调用bind()函数分配IP地址和端口号
if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
cout << "bind() error" << endl;
//1.3. 调用listen()函数将套接字转换为可接收连接状态
if (listen(serv_sock, 5) == -1)
cout << "listen() error" << endl;
clnt_addr_size = sizeof(clnt_addr);
//1.4. 调用accept()函数受理连接请求
clnt_sock = accept(se