#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

#define MAXLINE 4096

int main(int argc, char** argv)
{
    int    listenfd, connfd;
    struct sockaddr_in     servaddr,caddr;
    char    buff[4096];
    int     n;

if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
    printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

memset(&servaddr, 0, sizeof(servaddr));
    memset(&caddr,0,sizeof(caddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(6666);

if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
    printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

if( listen(listenfd, 10) == -1){
    printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

printf("======waiting for client's request======\n");
    while(1){
socklen_t length = sizeof(caddr);
    if( (connfd = accept(listenfd, (struct sockaddr*)&caddr,&length)) == -1){
        printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
        continue;
    }
    n = recv(connfd, buff, MAXLINE, 0);
    buff[n] = '\0';
    printf("recv msg from client: %s\n",buff);
    printf("recv msg from %s:client: %s\n", inet_ntoa(caddr.sin_addr),buff);
    close(connfd);
    }

close(listenfd);
}

客户端:原文未动

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

#define MAXLINE 4096

int main(int argc, char** argv)
{
    int    sockfd, n;
    char    recvline[4096], sendline[4096];
    struct sockaddr_in    servaddr;

if( argc != 2){
    printf("usage: ./client <ipaddress>\n");
    exit(0);
    }

if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
    printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
    exit(0);
    }

memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(6666);
    if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
    printf("inet_pton error for %s\n",argv[1]);
    exit(0);
    }

if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
    printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

printf("send msg to server: \n");
    fgets(sendline, 4096, stdin);
    if( send(sockfd, sendline, strlen(sendline), 0) < 0)
    {
    printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
    exit(0);
    }

close(sockfd);
    exit(0);
}

======================================================================================

各个函数介绍:

socket,原型:

int socket(int domain, int type, int protocol);

选择协议域(ipv4 ipv6),socket类型(流 其他),协议(tcp udp)

通过该操作 得到一个文件描述符

将文件描述符和监听端口绑定

bing(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

我们是是网络socket,所以要强转一下 ,两者区别:

struct sockaddr是通用的套接字地址,而struct sockaddr_in则是internet环境下套接字的地址形式

调用例子:

bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))

绑定之后,便是listen,accept

int listen(int sockfd, int backlog);
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

listen定义监听的最大连接数

accept将服务器socket与客户端的网络信息结合在一起,返回后续通讯达客户端句柄

客户端,先调用socket,获取文件句柄,然后将服务器参数和句柄绑定int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);  然后就可以愉快通讯了。注意有个网络字节序和主机字节序

网络是大端~~

//======================================================================================================================

头文件
    windows下:
    #include <WS2tcpip.h>
    linux下:
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include<arpa/inet.h>
    inet_pton函数
    将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。
    第一个参数可以是AF_INET或AF_INET6:
    第二个参数是一个指向点分十进制串的指针:
    第三个参数是一个指向转换后的网络字节序的二进制值的指针。
    inet_ntop函数
    和inet_pton函数正好相反,inet_ntop函数是将网络字节序二进制值转换成点分十进制串。
    第一个参数可以是AF_INET或AF_INET6:
    第二个参数是一个指向网络字节序的二进制值的指针;
    第三个参数是一个指向转换后的点分十进制串的指针;
    第四个参数是目标的大小,以免函数溢出其调用者的缓冲区。
    样例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main (void)
{
    char IPdotdec[20]; //存放点分十进制IP地址
    struct in_addr s; // IPv4地址结构体
    // 输入IP地址
    printf("Please input IP address: ");
    scanf("%s", IPdotdec);
    // 转换
    inet_pton(AF_INET, IPdotdec, (void *)&s);
    printf("inet_pton: 0x%x\n", s.s_addr); // 注意得到的字节序
    // 反转换
    inet_ntop(AF_INET, (void *)&s, IPdotdec, 16);
    printf("inet_ntop: %s\n", IPdotdec);
}

c++ TCP 获取客户端IP的更多相关文章

  1. (转)【ASP.NET开发】获取客户端IP地址 via C#

    [ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...

  2. 获取客户端IP地址 via C#

    获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己在项目中做过的事情,同 ...

  3. 分析php获取客户端ip

    用php能获取客户端ip,这个大家都知道,代码如下: /** * 获取客户端ip * @param number $type * @return string */ function getClien ...

  4. asp.net 获取客户端IP

    一.名词 首先说一下接下来要讲到的一些名词. 在Web开发中,我们大多都习惯使用HTTP请求头中的某些属性来获取客户端的IP地址,常见的属性是REMOTE_ADDR.HTTP_VIA和HTTP_X_F ...

  5. openresty开发系列40--nginx+lua实现获取客户端ip所在的国家信息

    openresty开发系列40--nginx+lua实现获取客户端ip所在的国家信息 为了实现业务系统针对不同地区IP访问,展示包含不同地区信息的业务交互界面.很多情况下系统需要根据用户访问的IP信息 ...

  6. PHP获取客户端IP

    /** * 获取客户端IP */ function getClientIp() { $ip = 'unknown'; $unknown = 'unknown'; if (isset($_SERVER[ ...

  7. C#服务器获取客户端IP地址以及归属地探秘

    背景:博主本是一位Windows桌面应用程序开发工程师,对网络通信一知半解.一日老婆逛完某宝,问:"为什么他们知道我的地址呢,他们是怎么获取我的地址的呢?" 顺着这个问题我们的探秘 ...

  8. 在Thinkphp3.2.3框架下实现自动获取客户端IP地址的get_client_ip()函数

    在Thinkphp框架下使用get_client_ip()函数获取客户端IP地址十分方便: 一行代码便可以实现:$ip = get_client_ip(); 但当我们测试时会遇到后台获取的IP地址显示 ...

  9. JAVA获取客户端IP地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

随机推荐

  1. 转帖 使用eclipse创建之前没有创建的web.xml

    由于在下学习Java的时间不长,所以对于一些工具的使用不太熟悉,特别是eclipse,虽然这是一款强大的Java编译工具但是现有汉化版.所以在实际使用的时候难免会遇到各种各样的麻烦.今天就遇到了一个: ...

  2. vue 数字输入组件

    index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  3. The 'with' and 'as' Keywords

    Programming is all about getting the computer to do the work. Is there a way to get Python to automa ...

  4. vue 父到子动态传值 子组件实时渲染

    近期项目中需要一个功能,根据选择不同的 团队片区 id 展示不同的数据,团队id 在父组件  数据在子组件中展示. 根据不同的团队 动态渲染数据总览. 父组件: <Cards ref=" ...

  5. java中EL表达式怎么获取网站的根目录

    ${pageContext.request.contextPath} <a href="${pageContext.request.contextPath}/login.jsp&quo ...

  6. shell重定向的顺序问题

    三个默认的文件描述符 0: stdin(标准输入) 1: stdout(标准输出) 2: stderr(标准错误输出) 系统中这3个文件描述符所对应的文件: 重定向顺序 示例脚本 echo " ...

  7. unittest框架学习笔记四之report

    # coding=utf-8'''created:2018/3/29 author:star project:test report'''# import time,os# from selenium ...

  8. CentOS6.8搭建LNMP环境

    selinux可能会致使编译安装失败,我们先禁用它.永久禁用,需要重启生效 sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/c ...

  9. JWT(JSON Web Token) 多网站的单点登录,放弃session 转载https://www.cnblogs.com/lexiaofei/p/7409846.html

    多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...

  10. ajax 重复提交

    1.一次点击事件触发两次请求,找到的原因是重复引用了同一个.js文件,后台返回来的数据是个页面,在这个页面里面又引用了.js,所以导致一次点击多次请求