您的位置:首页 > 理论基础 > 计算机网络

TCP Sever Client 面向连接的实现

2013-04-27 23:45 197 查看
下面的笔记本和代码是我在看 达内的视频教程时, 跟着视频敲下来的, 对于网络编程初学者来说, 是很好的入门教程.

面向连接实现

在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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息