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

简易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抓包效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: