求:在一台机器上模拟客户端和服务器端的简单vc的socket通信 在一台机器上模拟客户端和服务器端的简单vc的socket通信程序,最简单的那种。谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我的mail : [email protected] 一下是我吃饭的程序,奉献给你了// sockconsole.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "sockconsole.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifCWinApp theApp;using namespace std;#define SERVER//如果服务器则define 客户端则屏蔽此句#ifdef SERVER#define RUNIT server()#else#define RUNIT client()#endif#define MAX_THREADNUM 5void server();void gethostip();void client();DWORD WINAPI IOWithClient(LPVOID);int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){ AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0); RUNIT; Sleep(60000); return 0;}void server(){ printf("----------服务器端----------\n"); //初始化套接字 printf("初始化套接字..."); WSADATA wsadata; if(WSAStartup(0x0101,&wsadata)) { printf("失败!\n"); return; } else printf("OK\n"); gethostip(); //建立流套接字句柄 printf("建立流套接字句柄..."); SOCKET hSock=socket(AF_INET,SOCK_STREAM,0); if(hSock==INVALID_SOCKET) { printf("失败!\n"); return; } else printf("OK\n"); //绑定地址到套接字 printf("绑定地址到套接字..."); sockaddr_in addin; ZeroMemory(&addin,sizeof(addin)); addin.sin_family=AF_INET; addin.sin_port=htons(33333); addin.sin_addr.S_un.S_addr=INADDR_ANY; if(bind(hSock,(sockaddr *)(&addin),sizeof(addin))==SOCKET_ERROR) { printf("失败!\n"); return; } else printf("OK\n"); //进入监听状态 printf("进入监听状态..."); if(listen(hSock,MAX_THREADNUM)==SOCKET_ERROR) { printf("失败!\n"); return; } else { printf("OK\n"); } //接受连接 printf("接受连接..."); for(;;) { sockaddr_in clientaddin; int addinlength=sizeof(clientaddin); SOCKET *hConnected=new SOCKET; if((* hConnected=accept(hSock,(sockaddr *)(&clientaddin),&addinlength))==INVALID_SOCKET) { printf("失败!\n"); delete hConnected; } else { char * ipclient; ipclient=inet_ntoa(clientaddin.sin_addr); printf("Come From %s OK\n",ipclient); HANDLE hThread; hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)IOWithClient,(LPVOID)hConnected,0,NULL); } } //关闭SOCKET printf("关闭SOCKET..."); if(closesocket(hSock)==SOCKET_ERROR) { printf("失败!\n"); return; } else printf("OK\n"); //卸载SOCKET printf("卸载SOCKET..."); if(WSACleanup()==SOCKET_ERROR) { printf("失败!\n"); return; } else printf("OK\n");}void client(){ timeval timeout; int result; fd_set set; memset(&set,0,sizeof(fd_set)); memset(&timeout,0,sizeof(timeval)); printf("----------客户端----------\n"); //初始化套接字 printf("初始化套接字..."); WSADATA wsadata; if(WSAStartup(0x0101,&wsadata)) { printf("失败!\n"); return; } else printf("OK\n"); //建立流套接字句柄 printf("建立流套接字句柄..."); SOCKET hSock=socket(AF_INET,SOCK_STREAM,0); if(hSock==INVALID_SOCKET) { printf("失败!\n"); return; } else printf("OK\n"); //连接服务器地址 printf("连接服务器地址..."); sockaddr_in addin; ZeroMemory(&addin,sizeof(addin)); addin.sin_family=AF_INET; addin.sin_port=htons(33333); char tempgetip[20]; scanf("%s",tempgetip); addin.sin_addr.S_un.S_addr=inet_addr(tempgetip); if(connect(hSock,(sockaddr *)(&addin),sizeof(addin))==SOCKET_ERROR) { printf("失败!\n"); return; } else printf("OK\n"); //判断是否可写 printf("判断是否可写..."); FD_ZERO(&set); FD_SET(hSock,&set); timeout.tv_sec=2; if((result=select(0,NULL,&set,NULL,&timeout))==0) printf("判断服务器端是否可写超时!\n"); else if(result==SOCKET_ERROR) { printf("失败!"); return; } else printf("OK\n"); //发送数据 printf("发送数据..."); char buffer[100]; sprintf(buffer,"来自客户端的数据:Data from client......!"); if((result=send(hSock,buffer,strlen(buffer)+1,0))==SOCKET_ERROR) { printf("失败!\n"); return; } else printf("OK\n"); memset(buffer,0,sizeof(buffer)); //判断是否可读 printf("判断是否可读..."); FD_ZERO(&set); FD_SET(hSock,&set); timeout.tv_sec=2; if((result=select(0,&set,NULL,NULL,&timeout))==0) printf("判断服务器端是否可读超时!\n"); else if(result==SOCKET_ERROR) { printf("失败!\n"); return; } else printf("OK\n"); //接收数据 printf("接收数据..."); if((result=recv(hSock,buffer,sizeof(buffer),0))==0) printf("读取服务器端时客户端已经关闭!\n"); else if(result==SOCKET_ERROR) { printf("失败!\n"); return; } else printf("%s\n",buffer); //禁止SOCKET printf("禁止SOCKET..."); if(shutdown(hSock,SD_BOTH)==SOCKET_ERROR) { printf("失败!\n"); return; } else printf("OK\n"); //关闭SOCKET printf("关闭SOCKET..."); if(closesocket(hSock)==SOCKET_ERROR) { printf("失败!\n"); return; } else printf("OK\n"); //卸载SOCKET printf("卸载SOCKET..."); if(WSACleanup()==SOCKET_ERROR) { printf("失败!\n"); return; } else printf("OK\n");}void gethostip(){ printf("获得主机名..."); char hostname[128]; if(gethostname (hostname,128)==SOCKET_ERROR) { printf("失败!\n"); return; } else printf("OK\n"); hostent *host=gethostbyname(hostname);//可以是域名"www.163.com" printf("获得主机IP地址..."); if(host==NULL) { printf("失败!\n"); return; } char *ip; in_addr in; for(int i=0;host->h_addr_list[i]!=NULL;i++) { memmove(&in,host->h_addr_list[i],4); ip=inet_ntoa(in); printf("主机的IP地址为:%s\n",ip); }}DWORD WINAPI IOWithClient(LPVOID para){ SOCKET sock=*((SOCKET *)para); timeval timeout; int result; fd_set set; memset(&set,0,sizeof(fd_set)); memset(&timeout,0,sizeof(timeval)); //设置非阻塞模式 /*printf("设置非阻塞模式..."); DWORD value=1; if(ioctlsocket(sock,FIONBIO,&value)==SOCKET_ERROR) { printf("失败!\n"); return -1; } else printf("OK\n");*/ //判断是否可读 printf("判断是否可读..."); FD_ZERO(&set); FD_SET(sock,&set); timeout.tv_sec=2; if((result=select(0,&set,NULL,NULL,&timeout))==0) { printf("判断客户端是否可读超时!"); } else if(result==SOCKET_ERROR) { printf("失败!\n"); return -1; } else printf("OK\n"); //接收数据 printf("接收数据..."); char buffer[100]; if((result=recv(sock,buffer,sizeof(buffer),0))==0) printf("读取客户端时客户端已经关闭!\n"); else if(result==SOCKET_ERROR) { printf("失败!\n"); return -1; } else printf("%s\n",buffer); memset(buffer,0,sizeof(buffer)); //判断是否可写 printf("判断是否可写..."); FD_ZERO(&set); FD_SET(sock,&set); timeout.tv_sec=2; if((result=select(0,NULL,&set,NULL,&timeout))==0) printf("判断客户端是否写读超时!"); else if(result==SOCKET_ERROR) { printf("失败!\n"); return -1; } else printf("OK\n"); //发送数据 printf("发送数据..."); sprintf(buffer,"来自服务器端的数据:Data from server......!"); if((result=send(sock,buffer,strlen(buffer)+1,0))==SOCKET_ERROR) { printf("失败!\n"); return -1; } else printf("OK\n"); //禁止SOCKET printf("禁止SOCKET..."); if(shutdown(sock,SD_BOTH)==SOCKET_ERROR) { printf("失败!\n"); return -1; } else printf("OK\n"); //关闭SOCKET printf("关闭SOCKET..."); if(closesocket(sock)==SOCKET_ERROR) { printf("失败!\n"); return -1; } else printf("OK\n"); delete (SOCKET *)para; return 0;} 服务端:引入winsock.h1、初始化winsock---WSAStartup()2、构造监听套接字 socket()3、bind()绑定该套接字4、listen()开始监听5、accept()等待客户的连接客户:引入winsock.h1、初始化winsock---WSAStartup()2、构造监听套接字 socket()3、bind()绑定该套接字4、connect()连接服务然后两者都用recv()和send()接发数据 shenxin197735(有点菜): 好象不能用啊! 如何保存 截屏后的bmp啊!! 像这样的文件 打开/另存为 对话框如何创建?? 如何触发窗体WM_NOTIFY消息 请问程序界面设计问题 rtf格式转成纯文本 BeginWaitCursor()后的界面刷新的问题 请问如何删除一个文本文件中的最末一行? 一个基于对话框的程序,编译没错误,就是不运行,是啥意思? 请问在CAD中如何画3D按钮??? 这2台机器该怎么实现互相通讯? 用socket写邮件收发程序通讯的问题 高手帮忙 先谢了 如何在一个DialogBase的程序启动的时候,就自动隐藏其界面?
//#include "stdafx.h"
#include "sockconsole.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endifCWinApp theApp;
using namespace std;#define SERVER//如果服务器则define 客户端则屏蔽此句#ifdef SERVER
#define RUNIT server()
#else
#define RUNIT client()
#endif#define MAX_THREADNUM 5
void server();
void gethostip();
void client();
DWORD WINAPI IOWithClient(LPVOID);int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0); RUNIT;
Sleep(60000);
return 0;
}void server()
{
printf("----------服务器端----------\n");
//初始化套接字
printf("初始化套接字...");
WSADATA wsadata;
if(WSAStartup(0x0101,&wsadata))
{
printf("失败!\n");
return;
}
else
printf("OK\n");
gethostip();
//建立流套接字句柄
printf("建立流套接字句柄...");
SOCKET hSock=socket(AF_INET,SOCK_STREAM,0);
if(hSock==INVALID_SOCKET)
{
printf("失败!\n");
return;
}
else
printf("OK\n"); //绑定地址到套接字
printf("绑定地址到套接字...");
sockaddr_in addin;
ZeroMemory(&addin,sizeof(addin));
addin.sin_family=AF_INET;
addin.sin_port=htons(33333);
addin.sin_addr.S_un.S_addr=INADDR_ANY;
if(bind(hSock,(sockaddr *)(&addin),sizeof(addin))==SOCKET_ERROR)
{
printf("失败!\n");
return;
}
else
printf("OK\n"); //进入监听状态
printf("进入监听状态...");
if(listen(hSock,MAX_THREADNUM)==SOCKET_ERROR)
{
printf("失败!\n");
return;
}
else
{
printf("OK\n");
}
//接受连接
printf("接受连接...");
for(;;)
{
sockaddr_in clientaddin;
int addinlength=sizeof(clientaddin);
SOCKET *hConnected=new SOCKET;
if((* hConnected=accept(hSock,(sockaddr *)(&clientaddin),&addinlength))==INVALID_SOCKET)
{
printf("失败!\n");
delete hConnected;
}
else
{
char * ipclient;
ipclient=inet_ntoa(clientaddin.sin_addr);
printf("Come From %s OK\n",ipclient);
HANDLE hThread;
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)IOWithClient,(LPVOID)hConnected,0,NULL);
}
} //关闭SOCKET
printf("关闭SOCKET...");
if(closesocket(hSock)==SOCKET_ERROR)
{
printf("失败!\n");
return;
}
else
printf("OK\n");
//卸载SOCKET
printf("卸载SOCKET...");
if(WSACleanup()==SOCKET_ERROR)
{
printf("失败!\n");
return;
}
else
printf("OK\n");
}
void client()
{
timeval timeout;
int result;
fd_set set;
memset(&set,0,sizeof(fd_set));
memset(&timeout,0,sizeof(timeval)); printf("----------客户端----------\n");
//初始化套接字
printf("初始化套接字...");
WSADATA wsadata;
if(WSAStartup(0x0101,&wsadata))
{
printf("失败!\n");
return;
}
else
printf("OK\n"); //建立流套接字句柄
printf("建立流套接字句柄...");
SOCKET hSock=socket(AF_INET,SOCK_STREAM,0);
if(hSock==INVALID_SOCKET)
{
printf("失败!\n");
return;
}
else
printf("OK\n");
//连接服务器地址
printf("连接服务器地址...");
sockaddr_in addin;
ZeroMemory(&addin,sizeof(addin));
addin.sin_family=AF_INET;
addin.sin_port=htons(33333);
char tempgetip[20];
scanf("%s",tempgetip);
addin.sin_addr.S_un.S_addr=inet_addr(tempgetip);
if(connect(hSock,(sockaddr *)(&addin),sizeof(addin))==SOCKET_ERROR)
{
printf("失败!\n");
return;
}
else
printf("OK\n"); //判断是否可写
printf("判断是否可写...");
FD_ZERO(&set);
FD_SET(hSock,&set);
timeout.tv_sec=2;
if((result=select(0,NULL,&set,NULL,&timeout))==0)
printf("判断服务器端是否可写超时!\n");
else if(result==SOCKET_ERROR)
{
printf("失败!");
return;
}
else
printf("OK\n");
//发送数据
printf("发送数据...");
char buffer[100];
sprintf(buffer,"来自客户端的数据:Data from client......!");
if((result=send(hSock,buffer,strlen(buffer)+1,0))==SOCKET_ERROR)
{
printf("失败!\n");
return;
}
else
printf("OK\n");
memset(buffer,0,sizeof(buffer)); //判断是否可读
printf("判断是否可读...");
FD_ZERO(&set);
FD_SET(hSock,&set);
timeout.tv_sec=2;
if((result=select(0,&set,NULL,NULL,&timeout))==0)
printf("判断服务器端是否可读超时!\n");
else if(result==SOCKET_ERROR)
{
printf("失败!\n");
return;
}
else
printf("OK\n");
//接收数据
printf("接收数据...");
if((result=recv(hSock,buffer,sizeof(buffer),0))==0)
printf("读取服务器端时客户端已经关闭!\n");
else if(result==SOCKET_ERROR)
{
printf("失败!\n");
return;
}
else
printf("%s\n",buffer);
//禁止SOCKET
printf("禁止SOCKET...");
if(shutdown(hSock,SD_BOTH)==SOCKET_ERROR)
{
printf("失败!\n");
return;
}
else
printf("OK\n"); //关闭SOCKET
printf("关闭SOCKET...");
if(closesocket(hSock)==SOCKET_ERROR)
{
printf("失败!\n");
return;
}
else
printf("OK\n");
//卸载SOCKET
printf("卸载SOCKET...");
if(WSACleanup()==SOCKET_ERROR)
{
printf("失败!\n");
return;
}
else
printf("OK\n");
}void gethostip()
{
printf("获得主机名...");
char hostname[128];
if(gethostname (hostname,128)==SOCKET_ERROR)
{
printf("失败!\n");
return;
}
else
printf("OK\n");
hostent *host=gethostbyname(hostname);//可以是域名"www.163.com"
printf("获得主机IP地址...");
if(host==NULL)
{
printf("失败!\n");
return;
}
char *ip;
in_addr in;
for(int i=0;host->h_addr_list[i]!=NULL;i++)
{
memmove(&in,host->h_addr_list[i],4);
ip=inet_ntoa(in);
printf("主机的IP地址为:%s\n",ip);
}
}
DWORD WINAPI IOWithClient(LPVOID para)
{
SOCKET sock=*((SOCKET *)para);
timeval timeout;
int result;
fd_set set;
memset(&set,0,sizeof(fd_set));
memset(&timeout,0,sizeof(timeval));
//设置非阻塞模式
/*printf("设置非阻塞模式...");
DWORD value=1;
if(ioctlsocket(sock,FIONBIO,&value)==SOCKET_ERROR)
{
printf("失败!\n");
return -1;
}
else
printf("OK\n");*/ //判断是否可读
printf("判断是否可读...");
FD_ZERO(&set);
FD_SET(sock,&set);
timeout.tv_sec=2;
if((result=select(0,&set,NULL,NULL,&timeout))==0)
{
printf("判断客户端是否可读超时!");
}
else if(result==SOCKET_ERROR)
{
printf("失败!\n");
return -1;
}
else
printf("OK\n");
//接收数据
printf("接收数据...");
char buffer[100];
if((result=recv(sock,buffer,sizeof(buffer),0))==0)
printf("读取客户端时客户端已经关闭!\n");
else if(result==SOCKET_ERROR)
{
printf("失败!\n");
return -1;
}
else
printf("%s\n",buffer);
memset(buffer,0,sizeof(buffer));
//判断是否可写
printf("判断是否可写...");
FD_ZERO(&set);
FD_SET(sock,&set);
timeout.tv_sec=2;
if((result=select(0,NULL,&set,NULL,&timeout))==0)
printf("判断客户端是否写读超时!");
else if(result==SOCKET_ERROR)
{
printf("失败!\n");
return -1;
}
else
printf("OK\n");
//发送数据
printf("发送数据...");
sprintf(buffer,"来自服务器端的数据:Data from server......!");
if((result=send(sock,buffer,strlen(buffer)+1,0))==SOCKET_ERROR)
{
printf("失败!\n");
return -1;
}
else
printf("OK\n");
//禁止SOCKET
printf("禁止SOCKET...");
if(shutdown(sock,SD_BOTH)==SOCKET_ERROR)
{
printf("失败!\n");
return -1;
}
else
printf("OK\n");
//关闭SOCKET
printf("关闭SOCKET...");
if(closesocket(sock)==SOCKET_ERROR)
{
printf("失败!\n");
return -1;
}
else
printf("OK\n"); delete (SOCKET *)para;
return 0;
}
引入winsock.h
1、初始化winsock---WSAStartup()
2、构造监听套接字 socket()
3、bind()绑定该套接字
4、listen()开始监听
5、accept()等待客户的连接
客户:
引入winsock.h
1、初始化winsock---WSAStartup()
2、构造监听套接字 socket()
3、bind()绑定该套接字
4、connect()连接服务
然后两者都用recv()和send()接发数据
好象不能用啊!