【go语言 socket编程系列】TCPAddr类型与ResolveTCPAddr方法

本文详细介绍了Go语言中的TCPAddr结构体及其作用,解析了如何使用ResolveTCPAddr函数来创建TCPAddr实例,展示了函数的具体实现及代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【TCPAddr】

TCPAddr 是一个包含 IP和port的 struct。其定义在tcpsock.go 文件中。

// TCPAddr represents the address of a TCP end point.
type TCPAddr struct {
        IP   IP  
        Port int 
        Zone string // IPv6 scoped addressing zone
}

【常用方法】 

常用的方法有func ResolveTCPAddr(net, addr string) (*TCPAddr, error) ,通过输入net 和addr 来创建一个TCPAddr。

net 为 tcp  tcp4  tcp6 的一种,如果是 "" 则默认为tcp。

addr 是 类似”g.cn:80“或者”127.0.0.1:80“的字符串。 

其源码如下:

func ResolveTCPAddr(net, addr string) (*TCPAddr, error) {
        switch net {
        case "tcp", "tcp4", "tcp6":
        case "": // a hint wildcard for Go 1.0 undocumented behavior
                net = "tcp"
        default:
                return nil, UnknownNetworkError(net)
        }
        a, err := resolveInternetAddr(net, addr, noDeadline)
        if err != nil {
                return nil, err
        }
        return a.toAddr().(*TCPAddr), nil
}

【代码实现】

package main

import (
	"fmt"
	"net"
	"os"
	"unsafe"
)

func checkError(err error) {
	if err != nil {
		fmt.Println("Error !", err.Error())
		os.Exit(1)
	}
}

func typeof(v interface{}) {
	fmt.Printf("type is:%T\n", v)
}
func sizeof(v interface{}) {
	fmt.Println("sizeof is: ", unsafe.Sizeof(v))
}

func main() {
	addr := "www.baidu.com:80"
	tcpaddr, err := net.ResolveTCPAddr("", addr)
	checkError(err)

	fmt.Println("tcpaddr is:", tcpaddr)
	fmt.Println("IP is:", tcpaddr.IP.String(), "Port is", tcpaddr.Port)
	typeof(addr)
	typeof(tcpaddr)
	sizeof(addr)
	sizeof(tcpaddr)
	fmt.Println("addr len is:", len(addr))
	fmt.Println("tcpaddr len is:", len(tcpaddr.String()))

}

执行结果

$./l_ResolvTCPAddr 
tcpaddr is: 61.135.169.125:80
IP is: 61.135.169.125 Port is 80
type is:string
type is:*net.TCPAddr
sizeof is:  16
sizeof is:  16
addr len is: 16
tcpaddr len is: 17
$
 

### TCP编程教程及实现 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的传输层协议,广泛应用于网络通信。以下是关于TCP编程的相关内容和实现方式。 #### 1. TCP协议的特点 TCP协议具有以下特点: - 面向连接:在数据传输之前需要建立连接[^1]。 - 可靠性:通过确认机制、重传机制、流量控制和拥塞控制等手段保证数据完整性和有序性。 - 点对点:TCP连接是单个客户端单个服务器之间的通信[^1]。 #### 2. TCP编程流程 TCP编程通常分为客户端和服务器端两部分: - **服务器端**:监听指定端口,等待客户端连接请求,并处理通信数据[^3]。 - **客户端**:主动连接到服务器的IP地址和端口号,发送和接收数据。 #### 3. Go语言实现TCP编程 以下是一个使用Go语言实现的简单TCP服务端代码示例: ```go package main import ( "net" "fmt" ) func main() { fmt.Println("Server has been started ===>") tcpAddr, _ := net.ResolveTCPAddr("tcp", ":8000") tcpListener, _ := net.ListenTCP("tcp", tcpAddr) connMap := make(map[string]*net.TCPConn) for { tcpConn, _ := tcpListener.AcceptTCP() defer tcpConn.Close() connMap[tcpConn.RemoteAddr().String()] = tcpConn fmt.Println("Connected client info:", tcpConn.RemoteAddr().String()) } } ``` 此代码实现了基本的TCP服务端功能,能够监听8000端口并打印客户端连接信息[^2]。 #### 4. C语言实现TCP编程 以下是一个使用C语言实现的简单TCP客户端代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main() { // 创建一个通信的套接字 int sockfd = socket(AF_INET, SOCK_STREAM, 0); assert(sockfd != -1); struct sockaddr_in ser_addr; memset(&ser_addr, 0, sizeof(ser_addr)); ser_addr.sin_family = AF_INET; ser_addr.sin_port = htons(6000); // 转化端口号 ser_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 回环地址 // 连接服务器 int res = connect(sockfd, (struct sockaddr*)&ser_addr, sizeof(ser_addr)); assert(res != -1); // 通信 while (1) { printf("Input: "); char buff[128] = {0}; fgets(buff, 127, stdin); if (strncmp(buff, "end", 3) == 0) { break; } send(sockfd, buff, strlen(buff) - 1, 0); // 不发送\n memset(buff, 0, 128); recv(sockfd, buff, 127, 0); printf("%s\n", buff); } // 断开连接 close(sockfd); return 0; } ``` 此代码展示了如何创建一个TCP客户端,连接到本地的6000端口,并进行简单的消息收发[^4]。 #### 5. Java实现TCP编程 Java提供了`ServerSocket`和`Socket`类来封装操作系统接口,简化了TCP编程。以下是一个简单的Java服务端代码示例: ```java import java.io.*; import java.net.*; public class TCPServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8000); System.out.println("Server is running..."); while (true) { Socket socket = serverSocket.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println("Received: " + inputLine); out.println("Echo: " + inputLine); if (inputLine.equals("bye")) { break; } } socket.close(); } } } ``` 此代码实现了一个简单的TCP服务端,能够接收客户端消息并回显。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值