一、包含头文件及库
#include <winsock2.h>
#include <WS2tcpip.h>
#pragma comment(lib,"WS2_32.lib")
二、代码实现
WORD w_req = MAKEWORD(2, 2);
//版本号
WSADATA wsadata;
int err = WSAStartup(w_req, &wsadata);
if (err != 0) return -1;
//检测版本号
if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wHighVersion) != 2) return -1;
SOCKET tcp_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == tcp_fd)
{
err = WSAGetLastError();
printf("tcpsocket错误%d\n", err);
return -1;
}
SOCKADDR_IN sin_server;
sin_server.sin_family = AF_INET;
sin_server.sin_port = htons(9600);
sin_server.sin_addr.s_addr = inet_addr("127.0.0.1");
bool bOpt = true;
setsockopt(tcp_fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&bOpt, sizeof(bOpt));
err = bind(tcp_fd, (SOCKADDR*)&sin_server, sizeof(SOCKADDR));
if (SOCKET_ERROR == err)
{
err = WSAGetLastError();
printf("bind错误%d\n", err);
return -1;
}
err = listen(tcp_fd, SOMAXCONN);
if (err == SOCKET_ERROR)
{
err = WSAGetLastError();
printf("listen错误%d\n", err);
return -1;
}
int len = sizeof(SOCKADDR);
while (1)
{
//accept为阻塞接收
s_accept = accept(tcp_fd, (SOCKADDR*)&accept_addr, &len);
if (s_accept != SOCKET_ERROR)
{
while (1)
{
//此时的接收发送套接字为accept得到的
recv_len = recv(s_accept, recv_buf, 200, 0);
if (recv_len < 0)
{
closesocket(s_accept);
memset(&accept_addr, 0, sizeof(SOCKADDR_IN));
break;
}
send(s_accept, "\x01\x01", 2, 0);
}
}
}