我是TCP套接字编程的初学者。我想澄清一些关于TCP编程概念的疑问。我有一个客户端和服务器程序。这是我的C代码。 服务器代码:
#define MYPORT 39937
struct sockaddr_in serveraddress,cliaddr;
sd = socket( AF_INET, SOCK_STREAM, 0 );
memset( &serveraddress, 0, sizeof(serveraddress) );
serveraddress.sin_family = AF_INET;
serveraddress.sin_port = htons(MYPORT);//PORT NO
serveraddress.sin_addr.s_addr = htonl(INADDR_ANY);//ADDRESS
retbind=bind(sd,(struct sockaddr*)&serveraddress,sizeof(serveraddress));
connfd=accept(sd,(struct sockaddr*)&cliaddr,&len);
客户代码:
struct sockaddr_in serveraddress;
sd = socket( AF_INET, SOCK_STREAM, 0 );
argv[1]//for ip address
argv[2]//for port
argv[3]//for string to send
memset( &serveraddress, 0, sizeof(serveraddress) );
serveraddress.sin_family = AF_INET;
serveraddress.sin_port = htons(atoi(V[2]));//PORT NO
serveraddress.sin_addr.s_addr = inet_addr(V[1]);//ADDRESS
if(connect(sd,(struct sockaddr*)&serveraddress,
sizeof(serveraddress)) < 0)
{
printf("Cannot Connect to server");
exit(1);
}
write(sd, V[3], strlen(V[3]));
我知道客户端程序初始化服务器的端口和ipaddress。这是真的吗?如果是真的那么为什么我们在服务器程序中使用port和ipaddress? 我很迷惑 。另一个问题为什么我们不在客户端程序中使用客户端端口和ipaddress?服务器如何识别客户机的这个端口和地址?请解释有关服务器和客户端的整个概念
答案 0 :(得分:3)
我知道客户端程序初始化服务器的端口和ipaddress。这是真的吗?
客户端应用必须指定要连接的特定远程服务器IP /端口,是。
为什么我们在服务器程序中使用port和ipaddress?
服务器应用可能指定要监听的特定本地端口。如果未指定端口,则OS会选择随机可用端口。无论哪种方式,这都是客户端连接的端口。
服务器计算机可能有多个本地IP(如果它连接到多个网络),因此服务器应用可能指定特定的本地要听的IP。如果未指定IP,则服务器将侦听所有本地IP。这用于控制允许客户端连接的网络。
为什么我们不在客户端程序中使用客户端端口和ipaddress?
如果需要,你可以。这是可选。
客户端计算机可能具有多个本地IP(如果它连接到多个网络)。客户端可能指定要连接的特定本地IP,如果它知道到达服务器的特定网络连接。如果未指定IP,则操作系统使用其内部路由表来确定要使用的网络,然后从该本地IP进行连接。
客户端应用可能指定要从中连接的本地端口。某些协议需要这样,或者防火墙/路由器策略可能需要它。如果未指定端口,则OS会选择随机可用端口。无论哪种方式,这是客户端连接的端口。
服务器如何识别客户机的这个端口和地址?
accept()
和getpeername()
报告与服务器通信的客户端的远程IP /端口。
请解释有关服务器和客户端的整个概念
有关于该主题的全部书籍。它超出了StackOverflow的范围。
答案 1 :(得分:-3)
- 为什么我们不在TCP程序中使用客户端地址?
醇>
因为我们通常不需要。见下文。
- 我知道客户端程序初始化服务器的端口和ipaddress。这是真的吗?
醇>
客户端需要知道服务器的IP地址和端口,并使用它来初始化数据结构以连接到它,但是说客户端并不准确以任何方式初始化服务器的任何内容。
- 如果确实如此,为什么我们在服务器程序中使用port和ipaddress?我很困惑。
醇>
服务器需要初始化自己的IP地址和端口,以便它可以监听它。客户端需要在其自己的内存空间中对另一个数据结构进行初始化以连接到服务器。仅仅因为它具有相同的名称并不意味着它是同一块内存。
- 另一个问题,为什么我们不在客户端程序中使用客户端端口和ipaddress?
醇>
客户不需要知道自己的地址和端口。
- 服务器如何识别客户端计算机的端口和地址?
醇>
它没有。它不需要知道。它有一个连接到客户端的套接字。在大多数情况下,它只需要它。客户端发送连接请求;服务器通过相同的连接进行回复。
- 请解释有关服务器和客户端的整个概念
醇>
太宽了。