简易TCP与UDP编程模型
2015-03-03 13:40
225 查看
TCP服务端与客户端分别调用API函数的流程图:
服务端代码:
// TcpServer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <Winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsd; //WSADATA变量
SOCKET sServer,sClient; //服务端套接字,客户端套接字
int nRetVal; //返回值
printf("*****************************TCP服务端*******************************\n");
//初始化套接字动态库
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
//创建套接字
sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sServer)
{
printf("socket failed!\n");
return -1; //释放套接字资源
}
SOCKADDR_IN addrServer; //服务器地址
//服务器套接字地址
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(4999);
addrServer.sin_addr.s_addr = INADDR_ANY;
//绑定套接字
nRetVal = bind(sServer, (LPSOCKADDR)&addrServer, sizeof(SOCKADDR_IN));
if (SOCKET_ERROR == nRetVal)
{
printf("bind failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
//开始监听
nRetVal = listen(sServer, 1);
if (SOCKET_ERROR == nRetVal)
{
printf("listen failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
//接收客户端请求
SOCKADDR_IN addrClient;
int addrClientLen = sizeof(addrClient);
sClient = accept(sServer, (LPSOCKADDR)&addrClient, &addrClientLen);
if (INVALID_SOCKET == sClient)
{
printf("accept failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
char szBuf[MAX_PATH];
ZeroMemory(szBuf, MAX_PATH);
nRetVal = recv(sClient, szBuf, MAX_PATH, 0);
if (SOCKET_ERROR == nRetVal)
{
printf("recv failed!\n");
closesocket(sServer); //关闭套接字
closesocket(sClient); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
printf("%s\n", szBuf); //输出客户端发送来的信息
//退出
closesocket(sServer); //关闭套接字
closesocket(sClient); //关闭套接字
WSACleanup(); //释放套接字资源
return 0;
}
客户端代码:
// TcpClient.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <Winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsa; //WSADATA变量
SOCKET sServer; //服务端套接字
SOCKADDR_IN addrServer; //服务端地址
char szBuf[MAX_PATH]; //接收数据缓冲区
int nRetVal; //返回值
printf("*****************************TCP客户端*******************************\n");
//初始化套接字动态库
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0)
{
printf("WSAStartup failed!\n");
return -1;
}
//创建套接字
sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sServer)
{
printf("socket failed!\n");
WSACleanup();
return -1;
}
//设置服务端地址
addrServer.sin_family = AF_INET;
addrServer.sin_addr.s_addr = inet_addr("192.168.1.138");
addrServer.sin_port = htons(4999);
int nAddrServerLen = sizeof(addrServer);
//连接服务器
nRetVal = connect(sServer, (LPSOCKADDR)&addrServer, sizeof(addrServer));
if (SOCKET_ERROR == nRetVal)
{
printf("connect failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
//向服务端发送数据
ZeroMemory(szBuf, MAX_PATH);
strcpy(szBuf, "SimpleTcpDemo");
nRetVal = send(sServer, szBuf, strlen(szBuf), 0);
if (SOCKET_ERROR == nRetVal)
{
printf("send failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
//退出
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源
return 0;
}
wireshark抓包效果:
UDP服务端与客户端分别调用API函数的流程图:
服务端代码:
// UdpServer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <WINSOCK2.H>
#pragma comment(lib, "Ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsa; //WSADATA变量
SOCKET s; //套接字
printf("*****************************UDP服务端*******************************\n");
//初始化套接字动态库
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
//创建套接字
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
printf("socket() failed; %d\n", WSAGetLastError());
WSACleanup(); //释放套接字资源
return 1;
}
SOCKADDR_IN addrServer; //服务器地址
//服务器地址
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(5000); //端口
addrServer.sin_addr.s_addr = htonl(INADDR_ANY); //IP
//绑定
if (bind(s, (LPSOCKADDR)&addrServer, sizeof(addrServer)) == SOCKET_ERROR)
{
printf("bind() failed: %d\n", WSAGetLastError());
closesocket(s); //关闭套接字
WSACleanup(); //释放套接字资源
return 1;
}
char szBuf[MAX_PATH]; //接收数据缓冲区
//接收数据
SOCKADDR_IN addrClient;
int nClientLen = sizeof(addrClient);
ZeroMemory(szBuf, MAX_PATH);
if (recvfrom(s, szBuf, MAX_PATH, 0, (LPSOCKADDR)&addrClient, &nClientLen) == SOCKET_ERROR)
{
printf("recvfrom() failed: %d\n", WSAGetLastError());
closesocket(s); //关闭套接字
WSACleanup(); //释放套接字资源
return 1;
}
printf("%s\n", szBuf); //输出客户端发送来的数据
closesocket(s); //关闭套接字
WSACleanup(); //释放套接字资源
return 0;
}
客户端代码:
// udpClient.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <WINSOCK2.H>
#pragma comment(lib, "Ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsa; //WSADATA变量
SOCKET s; //套接字
printf("*****************************UDP客户端*******************************\n");
//初始化动态库动态库
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
//创建套接字
s = socket(AF_INET,SOCK_DGRAM, 0);
if (INVALID_SOCKET == s)
{
printf("socket() failed; %d\n", WSAGetLastError());
WSACleanup(); //释放套接字资源
return 1;
}
char szBuf[MAX_PATH];
ZeroMemory(szBuf, MAX_PATH);
strcpy(szBuf, "SimpleUdpDemo");
//服务器地址
SOCKADDR_IN addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_addr.s_addr = inet_addr("192.168.1.138");
addrServer.sin_port = htons(5000);
int nAddrServerLen = sizeof(addrServer);
if (sendto(s, szBuf, MAX_PATH, 0, (LPSOCKADDR)&addrServer, nAddrServerLen) == SOCKET_ERROR)
{
printf("sendto() failed: %d\n", WSAGetLastError());
closesocket(s); //关闭套接字
WSACleanup(); //释放套接字资源
return 1;
}
closesocket(s); //关闭套接字
WSACleanup(); //释放套接字资源
return 0;
}
wireshark抓包效果:
服务端代码:
// TcpServer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <Winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsd; //WSADATA变量
SOCKET sServer,sClient; //服务端套接字,客户端套接字
int nRetVal; //返回值
printf("*****************************TCP服务端*******************************\n");
//初始化套接字动态库
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
//创建套接字
sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sServer)
{
printf("socket failed!\n");
return -1; //释放套接字资源
}
SOCKADDR_IN addrServer; //服务器地址
//服务器套接字地址
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(4999);
addrServer.sin_addr.s_addr = INADDR_ANY;
//绑定套接字
nRetVal = bind(sServer, (LPSOCKADDR)&addrServer, sizeof(SOCKADDR_IN));
if (SOCKET_ERROR == nRetVal)
{
printf("bind failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
//开始监听
nRetVal = listen(sServer, 1);
if (SOCKET_ERROR == nRetVal)
{
printf("listen failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
//接收客户端请求
SOCKADDR_IN addrClient;
int addrClientLen = sizeof(addrClient);
sClient = accept(sServer, (LPSOCKADDR)&addrClient, &addrClientLen);
if (INVALID_SOCKET == sClient)
{
printf("accept failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
char szBuf[MAX_PATH];
ZeroMemory(szBuf, MAX_PATH);
nRetVal = recv(sClient, szBuf, MAX_PATH, 0);
if (SOCKET_ERROR == nRetVal)
{
printf("recv failed!\n");
closesocket(sServer); //关闭套接字
closesocket(sClient); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
printf("%s\n", szBuf); //输出客户端发送来的信息
//退出
closesocket(sServer); //关闭套接字
closesocket(sClient); //关闭套接字
WSACleanup(); //释放套接字资源
return 0;
}
客户端代码:
// TcpClient.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <Winsock2.h>
#pragma comment(lib, "Ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsa; //WSADATA变量
SOCKET sServer; //服务端套接字
SOCKADDR_IN addrServer; //服务端地址
char szBuf[MAX_PATH]; //接收数据缓冲区
int nRetVal; //返回值
printf("*****************************TCP客户端*******************************\n");
//初始化套接字动态库
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0)
{
printf("WSAStartup failed!\n");
return -1;
}
//创建套接字
sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sServer)
{
printf("socket failed!\n");
WSACleanup();
return -1;
}
//设置服务端地址
addrServer.sin_family = AF_INET;
addrServer.sin_addr.s_addr = inet_addr("192.168.1.138");
addrServer.sin_port = htons(4999);
int nAddrServerLen = sizeof(addrServer);
//连接服务器
nRetVal = connect(sServer, (LPSOCKADDR)&addrServer, sizeof(addrServer));
if (SOCKET_ERROR == nRetVal)
{
printf("connect failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
//向服务端发送数据
ZeroMemory(szBuf, MAX_PATH);
strcpy(szBuf, "SimpleTcpDemo");
nRetVal = send(sServer, szBuf, strlen(szBuf), 0);
if (SOCKET_ERROR == nRetVal)
{
printf("send failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
//退出
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源
return 0;
}
wireshark抓包效果:
UDP服务端与客户端分别调用API函数的流程图:
服务端代码:
// UdpServer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <WINSOCK2.H>
#pragma comment(lib, "Ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsa; //WSADATA变量
SOCKET s; //套接字
printf("*****************************UDP服务端*******************************\n");
//初始化套接字动态库
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
//创建套接字
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
{
printf("socket() failed; %d\n", WSAGetLastError());
WSACleanup(); //释放套接字资源
return 1;
}
SOCKADDR_IN addrServer; //服务器地址
//服务器地址
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(5000); //端口
addrServer.sin_addr.s_addr = htonl(INADDR_ANY); //IP
//绑定
if (bind(s, (LPSOCKADDR)&addrServer, sizeof(addrServer)) == SOCKET_ERROR)
{
printf("bind() failed: %d\n", WSAGetLastError());
closesocket(s); //关闭套接字
WSACleanup(); //释放套接字资源
return 1;
}
char szBuf[MAX_PATH]; //接收数据缓冲区
//接收数据
SOCKADDR_IN addrClient;
int nClientLen = sizeof(addrClient);
ZeroMemory(szBuf, MAX_PATH);
if (recvfrom(s, szBuf, MAX_PATH, 0, (LPSOCKADDR)&addrClient, &nClientLen) == SOCKET_ERROR)
{
printf("recvfrom() failed: %d\n", WSAGetLastError());
closesocket(s); //关闭套接字
WSACleanup(); //释放套接字资源
return 1;
}
printf("%s\n", szBuf); //输出客户端发送来的数据
closesocket(s); //关闭套接字
WSACleanup(); //释放套接字资源
return 0;
}
客户端代码:
// udpClient.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <WINSOCK2.H>
#pragma comment(lib, "Ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsa; //WSADATA变量
SOCKET s; //套接字
printf("*****************************UDP客户端*******************************\n");
//初始化动态库动态库
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
//创建套接字
s = socket(AF_INET,SOCK_DGRAM, 0);
if (INVALID_SOCKET == s)
{
printf("socket() failed; %d\n", WSAGetLastError());
WSACleanup(); //释放套接字资源
return 1;
}
char szBuf[MAX_PATH];
ZeroMemory(szBuf, MAX_PATH);
strcpy(szBuf, "SimpleUdpDemo");
//服务器地址
SOCKADDR_IN addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_addr.s_addr = inet_addr("192.168.1.138");
addrServer.sin_port = htons(5000);
int nAddrServerLen = sizeof(addrServer);
if (sendto(s, szBuf, MAX_PATH, 0, (LPSOCKADDR)&addrServer, nAddrServerLen) == SOCKET_ERROR)
{
printf("sendto() failed: %d\n", WSAGetLastError());
closesocket(s); //关闭套接字
WSACleanup(); //释放套接字资源
return 1;
}
closesocket(s); //关闭套接字
WSACleanup(); //释放套接字资源
return 0;
}
wireshark抓包效果:
相关文章推荐
- Linux网络编程8——对TCP与UDP的简易封装
- 传输层TCP和UDP编程模型
- JAVA基础 day25 网络编程 IP类 UDP,TCP传输学习 简易聊天工具 TCP并发学习
- Unix高级编程:网络基础、基于TCP以及UDP的编程模型、TCP高并发编程模型
- linux的tcp/udp网络编程模型
- 黑马程序员-网络编程概述-网络模型-UDP-TCP
- 【Linux网络编程】TCP/UDP编程模型
- Java基础-网络编程(概述、网络模型、TCP和UDP)
- TCP/UDP的套接字网络编程模型
- 网络编程一:概述、网络模型、TCP\UDP、Socket套接字、UDP发送和接收、UDP聊、阻塞式方法
- Linux网络编程--使用epoll模型同时处理tcp和udp服务
- Linux网络编程--使用epoll模型同时处理tcp和udp服务
- unxi域协议编程服务器端(tcp/udp)
- socket编程(udp tcp)代码备忘 C++/C
- 网络编程之TCP/UDP及其流程比较
- 基于UDP、TCP协议的C#网络编程之一
- udp与tcp编程区别
- socket与TCP/UDP编程
- [转贴]基于UDP、TCP协议的C#网络编程之一
- TCP,UDP IO模型(一)WSAAsyncSelect 异步选择