CSocket通信原理:TCP/IP
服务器端
1.创建一个socket套接字(用于监听)
2.获取服务器IP(本地IP)IP和端口端口(大于1024的端口)
3.开始监听
4.监听到有客户端连接服务器之后,创建一个新的socket套接字(用于通讯),用于和客户端之间的通信(继续监听)
5.用新的socket套接字和客户端进行通信
6.send();//发送消息
Receive();//接收消息
创建->绑定端口->监听->创建通信的socket->通信->关闭服务器
|
监听
客户端
1.创建一个socket套接字
2.根据服务器的IP地址和通信端口连接服务器
3.通过已经创建的socket套接字和客户端进行通信
4.send();//发送消息
Receive();//接收消息
5.关闭客户端 close();
创建->连接服务器->通信->关闭
UDP型套接字
服务器端(接收端)程序:
1、创建套接字(socket)。
2、将套接字绑定到一个本地地址和端口上(bind)。
3、等待接收数据(recvfrom)。
4、关闭套接字。 客户端(发送端)程序:
1、创建套接字(socket)。
2、向服务器发送数据(sendto)。
3、关闭套接字。
服务器端代码:
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) { return; }
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100];
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf("%s\n",recvBuf);
closesocket(sockSrv); WSACleanup();
}
客户端代码:
#include <Winsock2.h>
#include <stdio.h>
#include <Ws2tcpip.h>
#pragma comment(lib,"WS2_32.lib")
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) { return; }
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addrSrv;
InetPton(AF_INET,"127.0.0.1", (void *)&addrSrv.sin_addr.S_un.S_addr);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
sendto(sockClient, "Hello", strlen("Hello") + 1, 0, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}
q1:无法解析的外部符号
a1:在include后加一行#pragma comment(lib,“WS2_32.lib”)
q2:error C4996: ‘inet_addr’
a2:1.项目->属性->C/C+±>常规->SDL检查,将“是”改为“否”
2.使用新函数InetPton()(客户端里面有使用实例)