windows tcp demo
win_tcp_server:
// win_tcp_server.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<Windows.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
DWORD WINAPI Thread_rx(LPVOID p)
{
SOCKET sockClient = *(SOCKET*)p;
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
getpeername(sockClient,(SOCKADDR*)&addrClient,&len);
printf("Thread_rx,sockClient %lld,%s:%d pid = %d\n", sockClient, inet_ntoa(addrClient.sin_addr),ntohs(addrClient.sin_port), GetCurrentThreadId());
int ret = 1;
while (ret > 0) {
char recvbuf[1024] = { 0 };
ret = recv(sockClient, recvbuf, sizeof(recvbuf), 0);
printf("recv len %d:%s\n",ret, recvbuf);
strcat(recvbuf," res");
send(sockClient, recvbuf, (int)strlen(recvbuf), 0);
}
printf("Thread_rx pid = %d exit\n", GetCurrentThreadId());
return 0;
}
int main()
{
// 加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
// Winsock库版本,低字节代表主版本,高字节代表副版本
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return -1;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
//终止对winsock库的使用
WSACleanup();
return -1;
}
// 创建套接字
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
// 绑定到本机地址和端口
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
bind(sockSrv, (SOCKADDR*)& addrSrv, sizeof(addrSrv));
// 监听
listen(sockSrv, 5);// 5表示连接队列,超过5个client后会被拒绝连接
printf("start listen\n");
while (1)
{
// 用于接收客户端的地址信息
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
// 接受客户端的连接,返回client的套接字。
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)& addrClient, &len);
// 发送数据
char sendBuf[1024];
char ipstr[24] = { 0 };
sprintf(sendBuf, "Welcome %s:%d to here!", inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port));
printf("%s\n",sendBuf);
send(sockConn, sendBuf, (int)strlen(sendBuf), 0);
// 创建一个线程,单独处理client收发
HANDLE hThread;
DWORD threadId;
hThread = CreateThread(NULL, 0, Thread_rx, &sockConn, 0, &threadId);
}
return 0;
}
win_tcp_client:
// win_tcp_client.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <Windows.h>
#include <stdio.h>
#include <process.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
int main(int argc, char* argv[])
{
// 加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
// Winsock库版本,低字节代表主版本,高字节代表副版本
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return -1;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
//终止对winsock库的使用
WSACleanup();
return -1;
}
// 创建套接字
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
// 连接服务器
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
connect(sockClient, (SOCKADDR*)& addrSrv, sizeof(SOCKADDR));
int pid = _getpid();
int recvLen = 1;
int i = 0;
// 发送数据
while (recvLen > 0)
{
// 接收数据
char recvBuf[1024] = { 0 };
recvLen = recv(sockClient, recvBuf, 100, 0);
printf("recvLen %d,%s\n", recvLen, recvBuf);
char sendbuf[1024] = { 0 };
sprintf(sendbuf, "<%d>This is Client %4d",i++,pid);
int sentLen = send(sockClient, sendbuf, (int)strlen(sendbuf), 0);
Sleep(3000);
}
//关闭套接字
closesocket(sockClient);
//终止套接字库的使用
WSACleanup();
return 0;
}
运行效果: