十分简单的客户端
//coffeexp
#include "stdafx.h"
#include <winsock2.h>
using namespace std;
UINT startClient(LPVOID );
int _tmain()
{
AfxBeginThread(startClient,0);
getchar();
return 0;
}
UINT startClient(LPVOID pParam)
{
cout<<"client started!"<<endl;
SOCKET fd;
WSADATA wsaData;
sockaddr_in server_addr;
char recvbuff[1024];
memset(recvbuff,0,1024);
int wsaret=WSAStartup(0x101,&wsaData);
if(wsaret!=0)
return 0;
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons((u_short)50000);
fd=socket(AF_INET,SOCK_STREAM,0);
if(fd==INVALID_SOCKET)
cout<<"socket create error"<<endl;
if(connect(fd,(sockaddr*)&server_addr,sizeof(server_addr)))
{
cout<<"connect error"<<endl;
closesocket(fd);
return 0;
}
if(recv(fd,recvbuff,sizeof(recvbuff),0))
{
CString aa(recvbuff);
wcout<<"Data is: "<<aa<<endl;
}
closesocket(fd);
WSACleanup();
return 0;
}
服务端程序:
#include "stdafx.h"
#include <winsock2.h>
using namespace std;
UINT ServerThread(LPVOID );
int _tmain()
{
AfxBeginThread(ServerThread,0);
getchar();
return 0;
}
UINT ServerThread(LPVOID pParam)
{
cout<<"Starting TCP server...."<<endl;
SOCKET server;
WSADATA wsaData;
sockaddr_in local;
int wsaret=WSAStartup(0x101,&wsaData);
if(wsaret!=0)
return 0;
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons(50000);
server=socket(AF_INET,SOCK_STREAM,0);
if(server==INVALID_SOCKET)
return 0;
if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
return 0;
if(listen(server,2)!=0)
return 0;
SOCKET client;
sockaddr_in from;
int length=sizeof(from);
while(true)
{
CString s(L"you ip is :");
client =accept(server,(sockaddr*)&from,&length);
s+=inet_ntoa(from.sin_addr);
wcout<<(LPCTSTR)s<<endl;
send(client,(char*)(LPCTSTR)s,s.GetLength(),0);
cout<<"message had send to "<<inet_ntoa(from.sin_addr)<<endl;
closesocket(client);
}
closesocket(server);
WSACleanup();
return 0;
}
这里面有个有趣的问题,将S正确发到client,但client打印时只能显示第一个即"y",这就是著名的unicode ascii的转换。写在这里留个记念。
//coffeexp
#include "stdafx.h"
#include <winsock2.h>
using namespace std;
UINT startClient(LPVOID );
int _tmain()
{
AfxBeginThread(startClient,0);
getchar();
return 0;
}
UINT startClient(LPVOID pParam)
{
cout<<"client started!"<<endl;
SOCKET fd;
WSADATA wsaData;
sockaddr_in server_addr;
char recvbuff[1024];
memset(recvbuff,0,1024);
int wsaret=WSAStartup(0x101,&wsaData);
if(wsaret!=0)
return 0;
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons((u_short)50000);
fd=socket(AF_INET,SOCK_STREAM,0);
if(fd==INVALID_SOCKET)
cout<<"socket create error"<<endl;
if(connect(fd,(sockaddr*)&server_addr,sizeof(server_addr)))
{
cout<<"connect error"<<endl;
closesocket(fd);
return 0;
}
if(recv(fd,recvbuff,sizeof(recvbuff),0))
{
CString aa(recvbuff);
wcout<<"Data is: "<<aa<<endl;
}
closesocket(fd);
WSACleanup();
return 0;
}
服务端程序:
#include "stdafx.h"
#include <winsock2.h>
using namespace std;
UINT ServerThread(LPVOID );
int _tmain()
{
AfxBeginThread(ServerThread,0);
getchar();
return 0;
}
UINT ServerThread(LPVOID pParam)
{
cout<<"Starting TCP server...."<<endl;
SOCKET server;
WSADATA wsaData;
sockaddr_in local;
int wsaret=WSAStartup(0x101,&wsaData);
if(wsaret!=0)
return 0;
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons(50000);
server=socket(AF_INET,SOCK_STREAM,0);
if(server==INVALID_SOCKET)
return 0;
if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
return 0;
if(listen(server,2)!=0)
return 0;
SOCKET client;
sockaddr_in from;
int length=sizeof(from);
while(true)
{
CString s(L"you ip is :");
client =accept(server,(sockaddr*)&from,&length);
s+=inet_ntoa(from.sin_addr);
wcout<<(LPCTSTR)s<<endl;
send(client,(char*)(LPCTSTR)s,s.GetLength(),0);
cout<<"message had send to "<<inet_ntoa(from.sin_addr)<<endl;
closesocket(client);
}
closesocket(server);
WSACleanup();
return 0;
}
这里面有个有趣的问题,将S正确发到client,但client打印时只能显示第一个即"y",这就是著名的unicode ascii的转换。写在这里留个记念。