客户程序跟服务程序同在一个电脑,那客户程序连接的ip是?端口为什么不设置就出错呢

客户程序和服务程序同在一个电脑,那客户程序连接的ip是?端口为什么不设置就出错呢
这是客户程序
#include<Winsock.h>
#include<stdlib.h>
#include<stdio.h>

#pragma comment(lib,"ws2_32.lib")

int main(){
char buff[20];

int wVersionRequested =0x0201;

WSADATA wsaData;

 WSAStartup( wVersionRequested, &wsaData );


struct sockaddr_in servaddr;

int sock;//,n;
//unsigned long ultime;


    sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==INVALID_SOCKET )
printf("error\n");

servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(37);
servaddr.sin_addr.S_un.S_addr=inet_addr("172.21.107.176");
int ids=connect(sock,(const struct sockaddr*)&servaddr,sizeof(servaddr));

if(ids!=0){
printf("connect error %d\n",ids);


int err = WSAGetLastError();
 printf("unknown error id = %d\n",err); 

return 0;
}

int n;
if((n=recv(sock,buff,20,0 ))==SOCKET_ERROR){
int id = WSAGetLastError();
switch (id){
case WSANOTINITIALISED: 
printf("not initialized\n"); 
break;
case WSASYSNOTREADY: 
printf("sub sys not ready\n");
break;
case WSAHOST_NOT_FOUND:
printf("name server not found\n"); 
break;
case WSATRY_AGAIN:
printf("server fail\n");
break;
case WSANO_RECOVERY:
printf("no recovery\n"); 
break;
case WSAEINPROGRESS: 
printf("socket blocked by other prog\n");
break;
case WSANO_DATA:
printf("no data record\n");
break;
case WSAEINTR:
printf("blocking call canciled\n"); 
break;
case WSAEPROCLIM:
printf("limit exceeded\n");
break;
case WSAEFAULT:
printf("lpWSAData in startup not valid\n");
default: printf("unknown error id = %d\n",id); 
break;
}

}
buff[n]=0;
fputs(buff,stdout);

closesocket(sock);
return 0;

}

这是服务程序
#include<Winsock.h>
#include<stdio.h>
#include<string.h>
#include<conio.h>
#pragma comment(lib,"ws2_32.lib")  

#include<time.h>
#define LISTECOUNT 100

int main(){
int listened,newsock;
time_t ticks;
struct sockaddr_in servaddr;
char buff[100];


int wVersionRequested =0x0201;

WSADATA wsaData;

 WSAStartup( wVersionRequested, &wsaData );
listened=socket(AF_INET,SOCK_STREAM,0);
if(listened<0){
printf("socket error %d\n",listened);
return 0;}
memset(&servaddr,0,sizeof(servaddr));

servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(37);
servaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

if(bind(listened,(const struct sockaddr*)&servaddr,sizeof(servaddr))){
printf("error\n");
return 0;
}


if(listen(listened,LISTECOUNT)){
printf("listen error \n");

}



while(1){
newsock=accept(listened,0,0);
ticks=time(NULL);
sprintf(buff,"%s\n",ctime(&ticks));
    send(newsock,buff,strlen(buff),0);
closesocket(newsock);


}





}
当客户程序设置端口37,才能输出时间,为什么换台机子,就连不上服务器呢。还有,客户程序为什么要设置端口啊?不设置就出错时为什么?求解啊

------解决方案--------------------
IP是区分不同主机的;Port是区分不同应用程序的。两个都要有。
------解决方案--------------------
那客户程序连接的ip是:127.0.0.1....端口为什么不设置就出错呢:SOCKET连接需要指定端口的