이 기사에서는 로컬 소스 포트 번호를 얻기 위한 Linux 소켓 통신에 대한 관련 정보를 주로 소개합니다. 도움이 필요한 친구들은 이를 참고할 수 있습니다.
TCP IP 네트워크 통신에 대한 많은 정보가 있습니다. IP 패킷 모드를 통해. 일반적인 TCP 데이터 패킷은 다음과 같습니다
데이터 패킷에는 소스 포트 번호와 대상 포트 번호가 포함되어 있는 것을 볼 수 있습니다. 클라이언트 소켓이 서버에 대한 연결을 시작하면 시스템이 소스 포트를 무작위로 할당합니다. 성공적으로 연결된 소켓의 원래 포트 정보를 얻기 위해 getsocketname을 전달할 수 있습니다.
함수 프로토타입
#include <sys/socket.h> int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
매개변수:
sockfd 소켓 연결 핸들
addr 네트워크 주소 포인터, 로컬 소켓 주소 정보를 저장하는 데 사용됨,
addrlen addr 공간 크기
호출이 있는 경우 결과 반환 성공하면 0을 반환하고 로컬 네트워크 주소 정보를 addr에 저장한다. 실패하면 -1을 반환하고 errno를 통해 오류 메시지를 반영한다.
source_port.cpp
#include <cstring> #include <cstdio> #include <cstdlib> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <netinet/ip.h> #include <netdb.h> #include <errno.h> #include <unistd.h> #include <arpa/inet.h> void safe_close(int &sock); int main(int argc, char *argv[]) { int sockfd = 0, n = 0; socklen_t len = 0; char host[512] = {0}; char buf[1024] = {0}; struct hostent *server; struct sockaddr_in serv_addr, loc_addr; if (argc < 2) { printf("Please input host name\n"); exit(-1); } strncpy(host, argv[1], sizeof(host)); server = gethostbyname(host);// 判断输入的域名是否正确 if (NULL == server) { printf("find host: %s failed.\n", host); exit(-1); } if (-1 == (sockfd = socket(AF_INET, SOCK_STREAM, 0))) {// 创建socket memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf), "new socket failed. errno: %d, error: %s", errno, strerror(errno)); perror(buf); exit(-1); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(80);// http标准端口号 memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length); if (-1 == inet_pton(AF_INET, host, &serv_addr.sin_addr)) { memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf), "inet_pton failed. errno: %d, error: %s", errno, strerror(errno)); perror(buf); exit(-1); } if (-1 == connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))) {// 连接socket memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf), "connect socket failed. errno: %d, error: %s", errno, strerror(errno)); perror(buf); exit(-1); } printf("connect to %s success.\n", host); len = sizeof(sizeof(loc_addr)); memset(&loc_addr, 0, len); if (-1 == getsockname(sockfd, (struct sockaddr *)&loc_addr, &len)) {// 获取socket绑定的本地address信息 memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf), "get socket name failed. errno: %d, error: %s", errno, strerror(errno)); perror(buf); safe_close(sockfd); exit(-1); } if (loc_addr.sin_family == AF_INET) {// 打印信息 printf("local port: %u\n", ntohs(loc_addr.sin_port)); } safe_close(sockfd); return 0; } void safe_close(int &sock) { if (-1 != sock) { shutdown(sock, SHUT_RDWR); sock = -1; } }
이 프로그램은 먼저 일반 http 서버(baidu, qq, 163, csdn)에 연결하기 위해 소켓을 시작합니다. 소켓이 연결되면 연결의 로컬 주소를 얻습니다. getsocketname을 통해 바인딩하고 이 주소를 통해 소스 포트 번호를 가져옵니다.
터미널 1: 컴파일 및 실행
$ g++ source_port.cpp $ ./a.out www.baidu.com connect to www.baidu.com success. local port: 39702
터미널 2: tcpdump 패킷 캡처를 통해 확인
$ sudo tcpdump host www.baidu.com -v tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 18:38:32.381448 IP (tos 0x0, ttl 64, id 35033, offset 0, flags [DF], proto TCP (6), length 60) icentos.39702 > 220.181.111.188.http: Flags [S], cksum 0x8cd2 (incorrect -> 0x596a), seq 2381397554, win 29200, options [mss 1460,sackOK,TS val 3513497323 ecr 0,nop,wscale 7], length 0 18:38:32.425904 IP (tos 0x0, ttl 55, id 35033, offset 0, flags [DF], proto TCP (6), length 60) 220.181.111.188.http > icentos.39702: Flags [S.], cksum 0xc315 (correct), seq 3561856904, ack 2381397555, win 8192, options [mss 1424,sackOK,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,wscale 5], length 0 18:38:32.425930 IP (tos 0x0, ttl 64, id 35034, offset 0, flags [DF], proto TCP (6), length 40)
터미널 1과 터미널 2를 비교하면 얻은 소스 포트 주소가 올바른 것을 알 수 있습니다.
요약
위 내용은 Linux에서 로컬 소스 포트 번호를 얻기 위해 소켓 통신을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

linux设备节点是应用程序和设备驱动程序沟通的一个桥梁;设备节点被创建在“/dev”,是连接内核与用户层的枢纽,相当于硬盘的inode一样的东西,记录了硬件设备的位置和信息。设备节点使用户可以与内核进行硬件的沟通,读写设备以及其他的操作。

一、基于TCP协议的socket套接字编程1、套接字工作流程先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束,使用以下Python代码实现:importso

SpringBoot端第一步,引入依赖首先我们需要引入WebSocket所需的依赖,以及处理输出格式的依赖com.alibabafastjson1.2.73org.springframework.bootspring-boot-starter-websocket第二步,创建WebSocket配置类importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Config

本篇文章给大家带来了关于php+socket的相关知识,其中主要介绍了IO多路复用,以及php+socket如何实现web服务器?感兴趣的朋友下面一起来看一下,希望对大家有帮助。

php socket无法连接的解决办法:1、检查php是否开启socket扩展;2、打开php.ini文件,检查“php_sockets.dll”是否被加载;3、取消“php_sockets.dll”的注释状态即可。

本篇文章给大家带来了关于php+socket的相关知识,其中主要介绍了什么是socket?php+socket如何实现客户端与服务端数据传输?感兴趣的朋友下面一起来看一下,希望对大家有帮助。

随着互联网的发展,文件传输成为人们日常工作和娱乐中不可或缺的一部分。然而,传统的文件传输方式如邮件附件或文件分享网站存在一定的限制,无法满足实时性和安全性的需求。因此,利用PHP和Socket技术实现实时文件传输成为了一种新的解决方案。本文将介绍利用PHP和Socket技术实现实时文件传输的技术原理、优点和应用场景,并通过具体案例来演示该技术的实现方法。技术

C#中常见的网络通信和安全性问题及解决方法在当今互联网时代,网络通信已经成为了软件开发中必不可少的一部分。在C#中,我们通常会遇到一些网络通信的问题,例如数据传输的安全性、网络连接的稳定性等。本文将针对C#中常见的网络通信和安全性问题进行详细讨论,并提供相应的解决方法和代码示例。一、网络通信问题网络连接中断:网络通信过程中,可能会出现网络连接的中断,这会导致


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경
