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;
}
面向连接实现
在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;
}
相关文章推荐
- 简单用tcp实现一个client和sever间通信
- 一个TCP的问题,所谓TCP面向连接的虚电路到底是怎么实现的?
- 所谓TCP面向连接的虚电路到底是怎么实现的?
- 实现群发功能的sever-client 端的Java程序
- C#实现TCP连接信息统计的方法
- TCPserver Tcpclient 怎么实现聊天室一起聊天的功能呢?
- 面向连接的Socket Server的简单实现
- ping源码代阅读(三)面向连接tcp/ip程序
- TCP/IP源码学习(52)——TCP的连接过程的实现(1)
- 建立TCP连接,实现基本通信
- 使用socket实现进程间通信:(UNIX domain中面向连接通信)
- TCP/UDP client/server library for Java, 最好的java语言tcp udp 服务器客户端实现库
- NDK Socket编程:面向连接的通信(tcp)
- 【Java TCP/IP Socket】服务端的实现(可连接oracle数据库)
- TCP长连接服务的Java实现
- Linux实现TCP连接
- TCP套接字(server/client实现)
- Zeroc Ice TCP长连接 实现推送功能
- Oracle Client+ PLSQL developer实现远程连接Oracle数据库
- 配置oracle instance client。不需要安装oracle客户端实现程序以及plsql连接oracle服务端