为什么客户端和服务器连不上?
server.cpp:
#include <stdio.h>
#include "StdAfx.h"
#define SERV_TCP_PORT 6000
#define SERV_HOST_ADDR "192.168.1.67"
int sockfd;
DWORD ClientThread(void *pVoid)
{
int nRet;
char szBuf[1024];
memset(szBuf, 0, sizeof(szBuf));
/*接收来自客户端的数据信息*/
nRet = recv((SOCKET )pVoid,szBuf,sizeof(szBuf),0);
if (nRet == INVALID_SOCKET)
{
printf("recv()");
closesocket(sockfd);
closesocket((SOCKET)pVoid);
return 0;
}
/*显示接收到的数据*/
printf("\nData received: %s\n", szBuf);
/* 发送数据给客户端*/
strcpy(szBuf, "From the Server"); // 发送内容
nRet = send((SOCKET)pVoid, szBuf,strlen(szBuf),0);
closesocket((SOCKET)pVoid);
return 0;
}
int main()
{
int clilen;
int pHandle=-1;
struct sockaddr_in serv_addr;
SOCKET socketClient;
DWORD ThreadAddr;
HANDLE dwClientThread;
SOCKADDR_IN SockAddr;
/*初始化Winsock API*/
WORD wVersionRequested = MAKEWORD(1, 1);
WSADATA wsaData;
if (WSAStartup(wVersionRequested, &wsaData)) {
printf("WSAStartup failed %s\n", WSAGetLastError());
return -1;
}
/*打开一个TCP SOCKET */
if((sockfd=socket(AF_INET, SOCK_STREAM,0))<0)
printf("server:can't open stream socker\n");
/*绑定本地地址,以便客户端连接*/
memset((char *)&serv_addr,0,sizeof(struct sockaddr_in));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(SERV_TCP_PORT);
if(bind(sockfd,(struct sockaddr *)&serv_addr, sizeof(serv_addr))<0)
printf("server: can't bind local address");
listen(sockfd,5);
while(1)
{
clilen = sizeof(SOCKADDR_IN);
socketClient = accept(sockfd,
(LPSOCKADDR)&SockAddr,
&clilen);
/*出错处理*/
if (socketClient == INVALID_SOCKET)
{
printf("accept failed!\n");
break;
}
printf("Connection accepted on socket:%d from:%s\n",
socketClient,
inet_ntoa(SockAddr.sin_addr));
/*启动一个新线程处理该请求*/
dwClientThread =CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)&ClientThread,
(void *)socketClient,
0,
&ThreadAddr);
if(!dwClientThread)
printf("Cannot start client thread...");
/*线程建立以后,主程序里不再使用线程handle,将其关闭,但线程继续运行*/
CloseHandle((HANDLE)dwClientThread);
}
WSACleanup();
return 0;
}
client.cpp
#include "stdafx.h"
#include <stdio.h>
#define SERV_TCP_PORT 6000
#define SERV_HOST_ADDR "192.168.1.67"
int sockfd;
int main()
{
// 创建套节字
SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == INVALID_SOCKET)
{
printf(" Failed socket() \n");
return 0;
}
// 填写远程地址信息
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(4567);
// 注意,这里要填写服务器程序(TCPServer程序)所在机器的IP地址
// 如果你的计算机没有联网,直接使用127.0.0.1即可
servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)
{
printf(" Failed connect() \n");
return 0;
}
// 接收数据
char buff[256];
int nRecv = ::recv(s, buff, 256, 0);
if(nRecv > 0)
{
buff[nRecv] = '\0';
printf(" 接收到数据:%s", buff);
}
// 关闭套节字
::closesocket(s);
return 0;
}