Socket通信小例子
本文出处
作者:吴秦
链接:http://www.cnblogs.com/skynet/
转自:https://blog.csdn.net/dlutbrucezhang/article/details/8577810
InitSock.h
#pragma once
#include <WinSock2.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#pragma comment(lib, "WS2_32")
class CInitSock
{
public:
CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)
{
//初始化WS_32.dll
WSADATA wsaData;
WORD sockVersion = MAKEWORD(minorVer, majorVer);
if (::WSAStartup(sockVersion, &wsaData) != 0)
{
exit(0);
}
}
~CInitSock()
{
::WSACleanup();
}
private:
};
server.cpp
#include "InitSock.h"
#include <stdio.h>
#include <iostream>
using namespace std;
CInitSock initSock;
int main()
{
//创建监听套接字
SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sListen == INVALID_SOCKET)
{
cout << "Failed socket()" << endl;
return 0;
}
//绑定监听套接字到一个本地地址
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(4567);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
cout << "Failed bind()" << endl;
return 0;
}
//进入监听模式
if (::listen(sListen, 2) == SOCKET_ERROR)
{
cout << "Failed listen()" << endl;
return 0;
}
sockaddr_in remoteAddr;
int nAddrLen = sizeof(remoteAddr);
SOCKET sConn = 0;
char szText[] = "TCP Server Demo! \r\n";
while (sConn == 0)
{
sConn = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen); //accept 返回的是一个已连接套接字
if (sConn == INVALID_SOCKET)
{
cout << "Failed accept()" << endl;
}
cout << "receive a connection:" << inet_ntoa(remoteAddr.sin_addr) << endl;
continue;
}
while (1)
{
gets_s(szText);
::send(sConn, szText, strlen(szText), 0);
char buff[256];
int nRecv = ::recv(sConn, buff, 256, 0);
if (nRecv > 0)
{
buff[nRecv] = '\0';
cout << "the recv data:" << buff << endl;
}
}
::closesocket(sConn);
::closesocket(sListen);
return 0;
}
client.cpp
#include "InitSock.h"
#include <stdio.h>
#include <iostream>
using namespace std;
CInitSock initSock;
int main()
{
SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)
{
cout << "Failed socket()" << endl;
return 0;
}
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(4567);
serverAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (::connect(s, (sockaddr*)&serverAddr, sizeof(serverAddr)) == -1)
{
cout << "Failed connect()" << endl;
return 0;
}
char buff[256];
char szText[256];
while (1)
{
int nRecv = ::recv(s, buff, 256, 0);
if (nRecv > 0)
{
buff[nRecv] = '\0';
cout << "the recv data:" << buff << endl;
}
gets_s(szText);
szText[255] = '\0';
::send(s, szText, strlen(szText), 0);
}
::closesocket(s);
return 0;
}

浙公网安备 33010602011771号