#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
using namespace std;
#define BUF_SIZE 120
int main()
{
WSADATA wsadata;
if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
{
printf("WSAStartup() 初始化失败!\n");
return -1;
}
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)
{
printf("socket() 出错!\n");
::WSACleanup();
return -1;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(27105);
addr.sin_addr.s_addr = htonl(INADDR_ANY);//addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//servaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
int errCode;
errCode = bind(s, (SOCKADDR*)&addr, sizeof(struct sockaddr_in));
if (errCode == SOCKET_ERROR)
{
printf("bind() 出错\n");
::WSACleanup();
return -1;
}
errCode = listen(s, 3);
if (errCode == SOCKET_ERROR)
{
printf("listen() 出错!\n");
closesocket(s);
::WSACleanup();
return -1;
}
printf("Server Start!\n");
SOCKET sockAccept; //执行accept() 函数后新建的用于实际通信的套接字
struct sockaddr_in from; //用于接受接入地址
int len = sizeof(struct sockaddr_in);
sockAccept = accept(s, (SOCKADDR*)&from, NULL);
if (sockAccept == INVALID_SOCKET)
{
printf("accept() error!\n");
closesocket(s);
::WSACleanup();
return -1;
}
else
{
printf("acceppt() success!\n");
}
char buf[BUF_SIZE];
while (true)
{
::ZeroMemory(buf, BUF_SIZE);
errCode = recv(sockAccept, buf, BUF_SIZE, 0);
if (errCode == SOCKET_ERROR)
{
printf("recv() error!\n");
closesocket(sockAccept);
closesocket(s);
::WSACleanup(); system("pause");
return -1;
}
buf[errCode] = '\0';
SYSTEMTIME st;
::GetLocalTime(&st);
char szDateTime[60];
sprintf(szDateTime, "%4d-%d-%2d %2d:%2d:%2d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
printf("%s, Recv From Client [%s:%d]:%s\n", szDateTime, inet_ntoa(from.sin_addr), from.sin_port, buf);
if (strcmp(buf, "quit") == 0)
{
errCode = send(sockAccept, "quit", strlen("quit"), 0);
break;
}
else
{
char msg[BUF_SIZE];
sprintf(msg, "Message receive - %s", buf);
errCode = send(sockAccept, msg, strlen(msg), 0);
if (errCode == SOCKET_ERROR)
{
printf("send() error!\n");
closesocket(sockAccept);
closesocket(s);
::WSACleanup();
return -1;
}
}
}
if (WSACleanup() == SOCKET_ERROR)
{
printf("WSACleanup() 出错!\n\n");
}
system("pause");
return 0;
}
客户端
#include "winsock2.h"
#pragma comment(lib,"ws2_32.lib")
#include <iostream>
using namespace std;
#define BUF_SIZE 200
int main()
{
WSADATA wsadata;
if (WSAStartup(MAKEWORD(2, 2), &wsadata) != NO_ERROR)
{
printf("WSAStartup() 无法初始化!\n");
return -1;
}
SOCKET ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET)
{
printf("socket() 出错!\n");
WSACleanup();
return -1;
}
struct sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_port = htons(27105);
char cp[] = "127.0.0.1";
clientService.sin_addr.S_un.S_addr = inet_addr(cp);
if (connect(ConnectSocket, (sockaddr*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
{
printf("connect() 出错!\n");
closesocket(ConnectSocket);
WSACleanup();
return -1;
}
int byteSent, byteRecv;
char buf[BUF_SIZE];
while (true)
{
printf("Input a string to send: ");
cin >> buf;
byteSent = send(ConnectSocket, buf, strlen(buf), 0);
if (byteSent == SOCKET_ERROR)
{
printf("send() error!\n");
closesocket(ConnectSocket);
::WSACleanup();
return -1;
}
byteRecv = recv(ConnectSocket, buf, BUF_SIZE, 0);
buf[byteRecv] = '\0';
if (byteRecv == 0 || byteRecv == WSAECONNRESET)
{
printf("Connection Closed!\n");
break;
}
printf("Recv from Server: %s\n", buf);
if (strcmp(buf, "quit") == 0)
{
printf("quit!\n");
break;
}
}
closesocket(ConnectSocket);
WSACleanup();
system("pause");
return 0;
}