1. 程式人生 > >socket獲取客戶端ip例子

socket獲取客戶端ip例子

作者:吳秦
出處:http://www.cnblogs.com/skynet/
本文基於署名 2.5 中國大陸許可協議釋出,歡迎轉載,演繹或用於商業目的,但是必須保留本文的署名吳秦(包含連結).

例子原始碼來源於上面帖子。稍做修改,將客戶端地址獲取,並轉換成字串列印,找了一圈。沒有找到靠譜例子~~

#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, conststruct 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);  然後就可以愉快通訊了。注意有個網路位元組序和主機位元組序

網路是大端~~

相關推薦

socket獲取客戶ip例子

作者:吳秦出處:http://www.cnblogs.com/skynet/本文基於署名 2.5 中國大陸許可協議釋出,歡迎轉載,演繹或用於商業目的,但是必須保留本文的署名吳秦(包含連結). 例子原始碼來源於上面帖子。稍做修改,將客戶端地址獲取,並轉換成字串列印,找了

Socket獲取客戶IP地址及埠號

  Socket類包含一些非常有用的屬性,這些屬性允許確定關於正在連線的客戶端的資訊。其中關鍵資訊之一是返回EndPoint物件的RemoteEndPoint屬性。EndPoint類本身是抽象的,要想收集有用的資訊,需·要把EndPoint強制型別轉換為IPEndPoint物

Java獲取客戶IP

不為 pty 獲取 code 中間 clas 代理服務器 gin servle 在開發工作中,我們常常需要獲取客戶端的IP。一般獲取客戶端的IP地址的方法是:request.getRemoteAddr();但是在通過了Apache,Squid等反向代理軟件就不能獲取到客戶端

ASP.NET獲取客戶IP/用戶名等信息

username .net target list .get 獲取用戶信息 add dom 編程 1. 在ASP.NET中專用屬性: 獲取服務器電腦名:Page.Server.ManchineName 獲取用戶信息:Page.User 獲取客戶端電腦名:Page.Reque

PHP獲取客戶IP地址,服務器IP地址

客戶端 get sse spa gets static p地址 tip sta ============================================獲取客戶端IP==============================================

獲取客戶IP地址

type 數字 fun xpl func ram server ip地址 p地址 /** * 獲取客戶端IP地址 * @param integer $type 返回類型 0 返回IP地址 1 返回IPV4地址數字 * @param boole

獲取客戶ip訪問網站的次數和請求頁面腳本

客戶端ip訪問網站的次數和請求頁面腳本獲取客戶端ip訪問網站的次數和請求頁面 #/bin/bash cd /data/iplog/$1/pv txt=$(ls -l|awk ‘{print $NF}‘|sed ‘1d‘) for n in $txt do ip=$(cat /root/iplist) for

JAVA中經過nginx反向代理獲取客戶ip獲取相關坐標等信息

IT urn 輸出 代理 nginx 高德 AD color javascrip 關於搜狐新浪ip庫查詢接口的使用 直接輸出訪客ip及所在城市: <script src="http://pv.sohu.com/cityjson?ie=utf-8" >&l

獲取客戶 ip

shift reg server add arr rem xpl for false $ip = false; if (!empty($_SERVER["HTTP_CLIENT_IP"])) { $ip

java獲取客戶IP和服務器IP

ati () ted unknown lock back thead ssi 簡單的 一、Java獲取服務器IP(轉自:https://www.cnblogs.com/george93/p/6306579.html) //方法一,也是最簡單的一種。 String

關於獲取客戶IP問題

//相關程式碼 1、HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] 2、HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]3、HttpContex

JS獲取客戶IP地址、MAC和主機名的7個方法彙總

這篇文章主要介紹了JS獲取客戶端IP地址、MAC和主機名的7個方法彙總,JS本身是不支援獲取IP地址等資訊的,本文通過其它方法實現,需要的朋友可以參考下 今天在搞JS(javascript)獲取客戶端IP的小程式,上網搜了下,好多在現在的系統和瀏覽器中的都無效,很無奈,在C

指令碼獲取客戶IP

<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> <script type="text/javascript"> console.log(returnCitySN["cip"]+'

PHP 獲取客戶 IP 地址

先來了解一個變數的含義: $_SERVER['REMOTE_ADDR']:瀏覽當前頁面的使用者計算機的ip地址 $_SERVER['HTTP_CLIENT_IP']:客戶端的ip $_SERVER['HTTP_X_FORWARDED_FOR']:瀏覽當前頁面的使用者計算機的閘道器

jquery 獲取客戶ip地址 和 地區位置

搜狐IP地址查詢介面(預設GBK):http://pv.sohu.com/cityjson 搜狐IP地址查詢介面(可設定編碼):http://pv.sohu.com/cityjson?ie=utf-8 使用搜狐介面demo: <p id="ip"></p> <

Dorado7 AjaxAction Java獲取客戶IP

@Expose @DataProvider public String getCurrentEmployeeUserPrivilege(HttpServletRequest request, HttpServletResponse response){ String ip = req

Java Servlet獲取客戶IP

String ip = request.getHeader("x-forwarded-for");       if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

獲取nginx客戶IP地址 Java request獲取客戶ip,各種apach,nginx等代理後依然正確

Java request獲取客戶端ip,各種apach,nginx等代理後依然正確 2017年02月22日 17:15:15 閱讀數:3268 在JSP,Java裡,獲取客戶端的IP地址的方法是:request.getRem

在ASP.NET Core 2.x中獲取客戶IP地址

一、前言 大家也知道服務端請求時我們獲取的IP地址是包含在請求頭中,因此這也大大便利了IP的獲取。 在ASP.NET中,可以通過以下方式獲取客戶端的IP地址。 HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]

php獲取客戶ip地址或者伺服器ip地址

1.$_SERVER['REMOTE_ADDR'] 客戶端IP,有可能是使用者的IP,也可能是代理的IP。 2.$_SERVER['HTTP_CLIENT_IP'] 代理端的IP,可能存在可偽造。 3.$_SERVER['HTTP_X_FORWARDER_FOR'] 使用者是在哪個IP使用的代理,可