下面的笔记本和代码是我在看 达内的视频教程时, 跟着视频敲下来的, 对于网络编程初学者来说, 是很好的入门教程.
面向连接实现
在Windows下, 使用Socket编程, 首先初始化Socket库, 然后才能分别做服务端和客户端程序当前库的版本: 2.2
WSAStartup 用于初始化Socket库的API
int WSAStartup(
__in WORD wVersionRequested, // 版本号
__out LPWSADATA lpWSAData // 获取Socket的信息
);
动态库: WS2_32.dll
LIB: WS2_32.lib
头文件: windows.h
1. 服务器
1. 创建Socket
SOCKET socksvr = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2. 绑定端口和IP
bind函数, 需要指定绑定的IP和端口,
如果需要绑定本机所有IP, 将IP地址设为 INADDR_ANY;
3. 侦听
listen函数
4. 接收
accept函数 阻塞函数, 等候客户端的连接, 并返回连接好的socket
5. 数据收发
recv/send 默认情况下是阻塞函数
6. 关闭Socket
clossocket函数
2. 客户端
1. 创建Socket
SOCKET socksvr = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2. 连接服务器
connect函数, 需要指定连接服务器的IP地址和端口
3. 数据收发
recv/send 默认情况下是阻塞函数
4. 关闭Socket
clossocket函数
以下代码为服务端的代码, VS控制台工程
// server.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32.lib")
int TCPServer()
{
struct sockaddr_in svraddr;// = {0};
svraddr.sin_family = AF_INET;
svraddr.sin_port = htons(5678);
svraddr.sin_addr.S_un.S_addr = htons((INADDR_ANY));// 当前电脑任一IP
// 创建一个socket
SOCKET socksvr = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (socksvr == INVALID_SOCKET)
{
printf("创建Socket失败!\n");
return -1;
}
// 绑定IP和端口
bind(socksvr, (struct sockaddr *)&svraddr, sizeof(svraddr));
// 侦听, CMD 中 用netstat -an 可以看到当前的5678端口处于侦听状态
listen(socksvr, SOMAXCONN);
printf("等待客户端...\n");
// 等待客户端
struct sockaddr_in clientaddr = {0};
int nLen = sizeof(clientaddr);
SOCKET sockclient = accept(socksvr,
(struct sockaddr *)&clientaddr,
&nLen);
printf("客户端已连接.\n");
// 数据收发
CHAR szText[100] = {0};
recv(sockclient, szText, 100, 0);
printf("%s\n", szText);
CHAR szSend[100] = "Hello Client";
send(sockclient, szSend, sizeof(szSend), 0);
getchar(); // 暂停看现象
// 关闭
closesocket(sockclient);
closesocket(socksvr);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
// 初始化Socket库
WSADATA wsa = {0};
WSAStartup(MAKEWORD(2,2), &wsa);
// TCP 服务端
TCPServer();
return 0;
}
以下代码是客户端代码, VS控制台工程
// client.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32.lib")
int TCPClient()
{
struct sockaddr_in addr;// = {0};
addr.sin_family = AF_INET;
addr.sin_port = htons(5678);
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // 本机IP地址
// 创建一个socket
SOCKET sockclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockclient == INVALID_SOCKET)
{
printf("创建Socket失败!\n");
return -1;
}
// 连接服务器
connect(sockclient, (struct sockaddr *)&addr, sizeof(addr));
// 数据收发
CHAR szSend[100] = "Hello Sever";
send(sockclient, szSend, sizeof(szSend), 0);
CHAR szRecv[100] = {0};
recv(sockclient, szRecv, 100, 0);
printf("%s\n", szRecv);
getchar();
// 关闭Socket
closesocket(sockclient);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
// 初始化Socket库
WSADATA wsa = {0};
WSAStartup(MAKEWORD(2,2), &wsa);
// TCP 客户端
TCPClient();
return 0;
}