vs2010,Win32控制台程序:
服务器端:
// Win32_Socket_Server.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WORD sVersion;
WSADATA sWsa;
int nRes;
sVersion = MAKEWORD(1, 1);
nRes = WSAStartup(sVersion, &sWsa);
if (nRes != 0)
{
printf("Server:%d", WSAGetLastError());
return 0;
}
// 创建
SOCKET socket_Server = socket(AF_INET, SOCK_STREAM, 0);
if (socket_Server == INVALID_SOCKET)
{
printf("Server:%d", WSAGetLastError());
return 0;
}
// 绑定
SOCKADDR_IN addr_Server;
addr_Server.sin_family = AF_INET;
addr_Server.sin_port = htons(8888); // CMD:netstat -ano(确保端口未被占用)
addr_Server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
nRes = bind(socket_Server, (SOCKADDR*)&addr_Server, sizeof(SOCKADDR));
if (nRes != 0)
{
printf("Server:%d", WSAGetLastError());
return 0;
}
// 监听
listen(socket_Server, 5); // 后一个参数表示允许同时连接的人数
printf("listening...\n\n");
while (1)
{
SOCKADDR addr_Client;
int len = sizeof(addr_Client);
SOCKET socket_Client = accept(socket_Server, &addr_Client, &len);
if (socket_Client != INVALID_SOCKET)
{
printf("New Connection:%s\n\n", inet_ntoa( ((SOCKADDR_IN*)&addr_Client)->sin_addr) );
// 发送
char szTmp[] = "Server:This is Server!\n\n";
send(socket_Client, szTmp, strlen(szTmp) + 1, 0);
// 接收
char revBuf[128] = {0};
recv(socket_Client, revBuf, sizeof(revBuf), 0);
printf("%s\n\n", revBuf);
}
// 关闭
closesocket(socket_Client);
}
// 关闭
closesocket(socket_Server);
WSACleanup();
getchar();
return 0;
}
客户端:
// Win32_Socket_Client.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WORD sVersion;
WSADATA sWsa;
int nRes;
sVersion = MAKEWORD(1, 1);
nRes = WSAStartup(sVersion, &sWsa);
if (nRes != 0)
{
printf("Server:%d\n\n", WSAGetLastError());
return 0;
}
// 创建
SOCKET socket_Client = socket(AF_INET, SOCK_STREAM, 0);
if (socket_Client == INVALID_SOCKET)
{
printf("Server:%d", WSAGetLastError());
return 0;
}
// 连接
SOCKADDR_IN addr_Server;
addr_Server.sin_family = AF_INET;
addr_Server.sin_port = htons(8888); // CMD:netstat -ano(确保端口未被占用)
addr_Server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
nRes = connect(socket_Client, (SOCKADDR*)&addr_Server, sizeof(SOCKADDR));
if (nRes != 0)
{
if (WSAGetLastError() == WSAECONNREFUSED)
{
printf("错误代码10061:服务器端未启动!\n\n");
return 0;
}
printf("Server:%d\n\n", WSAGetLastError());
return 0;
}
// 接收
char revBuf[128] = {0};
recv(socket_Client, revBuf, sizeof(revBuf), 0);
printf("%s\n\n", revBuf);
// 发送
char szTmp[] = "Client:This is Client!\n\n";
send(socket_Client, szTmp, strlen(szTmp) + 1, 0);
// 关闭
closesocket(socket_Client);
WSACleanup();
getchar();
return 0;
}
运行截图:
(1)启动服务器:
(2)启动客户端:
(3)服务器端:
另注:关于库文件的导入有两种方式,除了显式地用语句#pragma comment(lib,"ws2_32.lib"),
还可以右键项目 -> 属性 -> 配置属性 -> 链接器 -> 输入 ->