Socket编程(一)
socket编程有两种实现方式。第一种是采用socket API ,第二种是采用MFC类库去实现。在这篇文章中,介绍Socket API实现方式
采用Winsock API 编程实现
TCPServer
注意事项:
项目配置: prpject->属性->配置属性->链接器->输入->附加依赖项->编辑
添加ws2_32.lib即可
@(我的第一个笔记本)
#include <WinSock2.h>
#include <stdio.h>
#include <windows.h>
void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return ;
}
if (LOBYTE(wsaData.wVersion) != 2 ||HIBYTE(wsaData.wVersion) != 2)
{
WSACleanup();
return ;
}
//套接字库加载完成
char sztext[] = "欢迎你\r\n";
SOCKET s, s1; //定义连接套接字和数据收发套接字句柄
s = ::socket(AF_INET, SOCK_STREAM, 0); //创建TCP套接字
sockaddr_in addr, addr2; //定义套接字地址结构
int n = sizeof(addr2); //获取套接字地址结构体大小
addr.sin_family = AF_INET; //初始化地址结构体
addr.sin_port = htons(10000);
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
::bind(s, (sockaddr*)&addr, sizeof(addr)); //绑定套接字
::listen(s, 5); //监听套接字
printf("服务器已经启动\n"); //输出启动信息
while (1)
{
s1 = ::accept(s, (sockaddr*)&addr2, &n);//接收连接请求
if (s1 != NULL)
{
printf("%s已经连接上\r\n", inet_ntoa(addr2.sin_addr));
send(s1, sztext, sizeof(sztext), 0); //向客户端发送字符
}
char recvbuf[100];
recv(s1, recvbuf, strlen(recvbuf)+1, 0);
printf("%s\r\n", recvbuf);
closesocket(s); //关闭套接字句柄
closesocket(s1);
WSACleanup(); //关闭套接字库
}
}
TCPClient
注意事项:
项目配置: prpject->属性->配置属性->链接器->输入->附加依赖项->编辑
添加ws2_32.lib即可
@(代码段)
#include <WinSock2.h>
#include <windows.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return;
}
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2)
{
WSACleanup();
return;
}
SOCKET s;
char sztext[10] = { 0 };
s = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(10000);
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
printf("客户端已经启动\r\n");
::connect(s, (sockaddr*)&addr, sizeof(addr));
::recv(s, sztext, sizeof(sztext), 0);
printf("%s\r\n", sztext);
::send(s, "this is client", strlen("this is client") + 1, 0);
::closesocket(s);
::WSACleanup();
system("pause");
}
服务端
客户端
/*************************************************************************************/
UDPServer
注意事项:
项目配置: prpject->属性->配置属性->链接器->输入->附加依赖项->编辑
添加ws2_32.lib即可
@(代码段)
#include <WinSock2.h>
#include <windows.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return;
}
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions later */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup();
return;
}
/* The WinSock DLL is acceptable. Proceed. */
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in addr, addr2;
int n = sizeof(addr2);
char buf[10] = { 0 };
addr.sin_family = AF_INET;
addr.sin_port = htons(6000);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
bind(s, (sockaddr*)&addr, sizeof(addr));
printf("UDP服务器已经启动\r\n");
char sztext[] = "欢迎你\r\n";
while (1)
{
//接收客户端的消息
if (recvfrom(s, buf, 10, 0, (sockaddr*)&addr2, &n) != 0)
{
printf("%s已经连上\r\n", inet_ntoa(addr.sin_addr));
printf("%s\r\n", buf);
//发送数据到客户端
sendto(s, sztext, sizeof(sztext), 0, (sockaddr*)&addr2, n);
break;
}
}
closesocket(s);
WSACleanup();
system("pause");
}
UDPClient
注意事项:
项目配置: prpject->属性->配置属性->链接器->输入->附加依赖项->编辑
添加ws2_32.lib即可
@ (代码段)
#include <WinSock2.h>
#include <windows.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return;
}
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions later */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup();
return;
}
/* The WinSock DLL is acceptable. Proceed. */
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in addr, addr2;
int n = sizeof(addr2);
char buf[10] = { 0 };
addr.sin_family = AF_INET;
addr.sin_port = htons(6000);
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//bind(s, (sockaddr*)&addr, sizeof(addr));
printf("UDP客户端已经启动\r\n");
char sztext[] = "你好\r\n";
//发送信息
if (sendto(s,sztext,sizeof(sztext),0,(sockaddr*)&addr,n)!=0)
{
recvfrom(s, buf, 10, 0, (sockaddr*)&addr2, &n);//接收消息
printf("服务器说:%s\r\n", buf);
closesocket(s);
WSACleanup();
}
system("pause");
}
服务端
客户端