我正在学习C ++中的Socket编程。我知道套接字必须绑定到服务器地址,并且在客户端,调用bind()
时有一个内部connect()
。服务器监听sin_port
的{{1}}中指定的端口。
但是,当我在客户端struct sockaddr_in
的{{1}}中指定相同的端口时,是否意味着客户端和服务器都绑定在同一端口上。我希望这是一部分,我做错了。
以下是代码:
服务器:
sin_port
客户
struct sockaddr_in
答案 0 :(得分:3)
服务器应bind
到客户端connect
的相同端口。这样,服务器和客户端将彼此交谈。通常,服务器bind
到一个知名端口,listen
到一个已知端口。客户端不调用bind
,这导致它绑定到随机端口。但是它确实调用connect
连接到服务器的知名端口。服务器在众所周知的端口上侦听,发送和接收。客户端连接到已知端口,从已知端口发送和接收。
此外,实际上不要这样做:
recv(sockid,buff,1024,0);
cout<<"Received msg: "<<buff;
TCP不是基于消息的协议。 recv
函数在TCP套接字上调用时,不不会接收消息,甚至不知道消息是什么。当像您一样调用流的operator<<
并将其传递给char *
时,它期望char *
指向有效的C样式字符串,此代码无法保证。更糟糕的是,您已经忽略了recv
的返回值,这是唯一的知道收到多少字节的方式。
这里有一个类似的问题:
if(send(client_socket,buff,strlen(buff),0)<0){
您不会发送终止的零字节,因此,接收者无法确定消息的结束位置,除非您随后关闭了连接。仅在您只想发送一条消息然后关闭连接而没有任何响应可能性的确切情况下,此方法才有效。并且,在这种情况下,接收者需要继续调用recv
直到收到表明连接已经关闭的指示,然后它才认为自己已收到消息。