#include "stdafx.h" #include "WinSock2.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsaData; SOCKET ListeningSocket; SOCKADDR_IN ServerAddr; SOCKET NewConnection; SOCKADDR_IN ClientAddr; int Port = 5150; WSAStartup(MAKEWORD(2, 2), &wsaData);// 初始化Windows Socket 2.2 ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建一个新的Socket来响应 客户端的连接请求;AF_INET字段是表示网络地址的类型,AF_INET表示是internet域中进行通信;SOCK_STREAM表示socket的类型,SOCK_STREAM表示是流套接字IPPROTO_TCP表明协议类型,IPPROTO_TCP或者0表示TCP/IP协议 ServerAddr.sin_family = AF_INET; // 填写服务器地址信 ServerAddr.sin_port = htons(Port); // 端口为5150 ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY表示机器上的所用网络地址 ; 比如你的机器上有两张网卡,那么到达这两张网卡的数据,你的socket都可以得到通知;htonl将IP地址转换为网络格式 bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)); //绑定监听端口;当调用socket函数创建套接字后,该套接字并没有与本机地址和端口等信息相连,bind函数将完成这些工作 listen(ListeningSocket, 2); // 开始监听,指定最大同时连接数为2 int len = sizeof(ClientAddr); NewConnection = accept(ListeningSocket, (SOCKADDR *)&ClientAddr, &len);// 接受新的连接 cout << "************************************************" << endl; cout << "****new client has been connected******" << endl; cout << "*************************************************" << endl; /* 当连接建立之后,我们就可以在这里和client进行通信,传输数据了*/ closesocket(NewConnection); //关闭连接 closesocket(ListeningSocket); //并关闭监听Socket WSACleanup(); // 释放Windows Socket DLL的相关资源 return 0; }
Client端代码:
#include "stdafx.h" #include "WinSock2.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsaData; SOCKET s; SOCKADDR_IN ServerAddr; int Port = 5150; WSAStartup(MAKEWORD(2, 2), &wsaData); //初始化Windows Socket 2.2 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建一个新的Socket来连接服务器 ServerAddr.sin_family = AF_INET; ServerAddr.sin_port = htons(Port); ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //在程序中我与本机进行通信 int result = connect(s, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)); // 向服务器发出连接请求 if (result == 0){ //result==0表示连接成功 cout << "Client has connected to server!"; } closesocket(s); WSACleanup(); return 0; }
总结:建立网络连接的过程
连接ws2_32.lib
scoket 建立套接字
bind绑定套接字
listen套接字监听
accept接受连接请求
connect发起连接请求
send发送数据
recv接收数据