Вот примерно то, yf C++ (API), если где-то я ошибся, то уж извиняйте - на вскидку все. Но основной принцип я думаю будет понятен. Передача синхронная.
Код:
....
WORD wVersionRequested;
WSADATA wsaData;
DWORD err;
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsaData);
if (err!=0)
exit(-1);
if (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{ //If sock version lover than 2.2
AfxMessageBox("Sock wersion lover than 2.2. Inspect your system!");
WSACleanup();
exit(-1);
}
...
SOCKET m_clsock1;
SOCKET m_clsock2;
m_clsock1=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //init socket
m_clsock2=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (m_clsock1==INVALID_SOCKET|| m_clsock2==INVALID_SOCKET) //Init error
{
str.Format("Error at socket(): %ld\n", WSAGetLastError());
AfxMessageBox(str);
WSACleanup();
exit(-1);
}
hostent* remoteHost;
unsigned int addr;
if (isalpha(host1[0]))
{
remoteHost=gethostbyname(host1); //Get host info from name
}
else
{
addr=inet_addr(host1);
remoteHost=gethostbyaddr((char *)&addr, 4, AF_INET); //Get host info from IP
}
if (WSAGetLastError()!=0) //Something wrong
{
if (WSAGetLastError()==11001)
str="Host not found...";
else
str.Format("error#:%ld", WSAGetLastError());
closesocket(m_clsock1);
closesocket(m_clsock2);
m_clsock1=INVALID_SOCKET;
m_clsock2=INVALID_SOCKET;
AfxMessageBox(str); //Inform user about it
WSACleanup();
exit(-1);
}
sockaddr_in clientService;
//Fill necessary data
clientService.sin_family=AF_INET;
memcpy(&(clientService.sin_addr.s_addr),remoteHost->h_addr_list[0],4);
char *aaa=inet_ntoa(clientService.sin_addr);
clientService.sin_port=htons(3302);
//try to connect with filled data
DWORD zz=connect(m_clsock1,(SOCKADDR*)&clientService,sizeof(clientService));
if (zz==SOCKET_ERROR) //din't connected
{
closesocket(m_clsock1);
closesocket(m_clsock2);
m_clsock1=INVALID_SOCKET;
m_clsock2=INVALID_SOCKET;
AfxMessageBox("Faild to connect!");
WSACleanup();
exit(-1);
}
if (isalpha(host2[0]))
{
remoteHost=gethostbyname(host2); //Get host info from name
}
else
{
addr=inet_addr(host2);
remoteHost=gethostbyaddr((char *)&addr, 4, AF_INET); //Get host info from IP
}
if (WSAGetLastError()!=0) //Something wrong
{
if (WSAGetLastError()==11001)
str="Host not found...";
else
str.Format("error#:%ld", WSAGetLastError());
closesocket(m_clsock1);
closesocket(m_clsock2);
m_clsock1=INVALID_SOCKET;
m_clsock2=INVALID_SOCKET;
AfxMessageBox(str); //Inform user about it
WSACleanup();
exit(-1);
}
memcpy(&(clientService.sin_addr.s_addr),remoteHost->h_addr_list[0],4);
char *aaa=inet_ntoa(clientService.sin_addr);
clientService.sin_port=htons(3302);
DWORD zz=connect(m_clsock1,(SOCKADDR*)&clientService,sizeof(clientService));
if (zz==SOCKET_ERROR) //din't connected
{
closesocket(m_clsock1);
closesocket(m_clsock2);
m_clsock1=INVALID_SOCKET;
m_clsock2=INVALID_SOCKET;
WSACleanup();
AfxMessageBox("Faild to connect!");
exit(-1);
}
char rBuffer[1024];
long bytes_rcv;
//код пересылки
while ((bytes_rcv=recv(m_clsock1,rBuffer,1024,0))>0)
{
if (send(m_clsock2,rBuffer,1024,0)<=0)
{
closesocket(m_clsock1);
closesocket(m_clsock2);
m_clsock1=INVALID_SOCKET;
m_clsock2=INVALID_SOCKET;
WSACleanup();
AfxMessage("Can't send data!!!");
exit(-1);
}
}
closesocket(m_clsock1);
closesocket(m_clsock2);
m_clsock1=INVALID_SOCKET;
m_clsock2=INVALID_SOCKET;
WSACleanup();
exit(0);