accept读取用户的连接信息,取出ip地址和端口号
最简单的accept
通过accept接收到连接后,会产生一个新的socket句柄,表示一个单独为该连接写入的socket文件
int client_sock=accept(sock,0,0); //0代表不想知道对方的连接信息
// 会返回一个新的socket,与这个用户单独进行通信的,每一个连接都会生成一个socket
cout<<"client sock"<<client_sock<<endl;
获取客户端的ip和端口号
通过结构体sockaddr_in 存取地址和端口
// 获取 连接客户端的ip和端口号
sockaddr_in caddr;
socklen_t len=0;
int client_sock=accept(sock,(sockaddr*)&caddr,&len);
cout<<"client sock"<<client_sock<<endl;
string ip=inet_ntoa(caddr.sin_addr);
cout<<"client ip:"<<ip<<endl;
unsigned short cport=ntohs(caddr.sin_port);//把网络上转换成本地的,linux其实不需要
cout<<"client port:"<<cport<<endl;
整体代码
// socket_test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <arpa/inet.h>
#include <iostream>
// 宏会在编译之前就执行,比如Linux时就不会有以下的代码
#ifdef WIN32 // 当存在WIN32的宏时,会执行中间的
#include <windows.h>
#else
#include <sys/types.h> /* linux 引用这两个*/
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <stdlib.h>
#endif
using namespace std;
int main(int argc,char* argv[])
{
unsigned short port=8080;
if (argc>1)
{
port=atoi(argv[1]);//atoi 字符串转化为数字
}
#ifdef WIN32 // 在linux中不需要以下的初始化
// windows 调用socket 库 ,需要1. 初始化动态库 2. 引用lib库
WSADATA ws;
WSAStartup(MAKEWORD(2, 2), &ws);//也加载动态库,引用加1
#endif
int sock=socket(AF_INET,SOCK_STREAM,0);//确定用什么协议,用tcp ip 小于0代表失败
if(sock<0)
{
cout<<"连接失败"<<endl;
return -1;
}
sockaddr_in saddr; //存取ip地址,port
saddr.sin_family=AF_INET; //tcp/ip协议
saddr.sin_port=htons(port); // 统一转化为大端存储(网络默认)
saddr.sin_addr.s_addr=htonl(0);//一个机器可能有多个ip,这里默认任意ip都可以接受
// socket 和 端口ip等信息绑定
if(bind(sock,(sockaddr*)&saddr,sizeof(saddr))!=0)
{
cout<<"绑定失败"<<endl;
return -2;
}
cout<<"绑定成功"<<endl;
//开始监听
listen(sock,10);
// int client_sock=accept(sock,0,0); //0代表不想知道对方的连接信息
// // 会返回一个新的socket,与这个用户单独进行通信的,每一个连接都会生成一个socket
// cout<<"client sock"<<client_sock<<endl;
// 获取 连接客户端的ip和端口号
sockaddr_in caddr;
socklen_t len=0;
int client_sock=accept(sock,(sockaddr*)&caddr,&len);
cout<<"client sock"<<client_sock<<endl;
string ip=inet_ntoa(caddr.sin_addr);
cout<<"client ip:"<<ip<<endl;
unsigned short cport=ntohs(caddr.sin_port);//把网络上转换成本地的,linux其实不需要
cout<<"client port:"<<cport<<endl;