一、什么是Socket
socket即套接字,用于描述地址和端口,是一个通信链的句柄。应用程序通过socket向网络发出请求或者回应。
二、编程步骤
(1)服务端
1、加载套接字库,创建套接字(WSAStartup()/socket());
2、绑定套接字到一个IP地址和一个端口上(bind());
3、将套接字设置为监听模式等待连接请求(listen());
4、请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
5、用返回的套接字和客户端进行通信(send()/recv());
6、返回,等待另一个连接请求;
7、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup());
(2)客户端
1、加载套接字库,创建套接字(WSAStartup()/socket());
2、向服务器发出连接请求(connect());
3、和服务器进行通信(send()/recv());
4、关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup());
三、windows下实现socket简单实例
使用软件:devc++
(一)TCP协议
(1)代码
服务端:server.cpp
- #include <stdio.h>
- #include <winsock2.h>
- #pragma comment(lib,"ws2_32.lib")
- int main(int argc, char*argv[])
- {
- //初始化WSA
- WORD sockVersion =MAKEWORD(2,2);
- WSADATA wsaData;
- if(WSAStartup(sockVersion, &wsaData)!=0)
- {
- return0;
- }
- //创建套接字
- SOCKET slisten =socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if(slisten ==INVALID_SOCKET)
- {
- printf("socket error !");
- return0;
- }
- //绑定IP和端口
- sockaddr_insin;
- sin.sin_family =AF_INET;
- sin.sin_port =htons(8888);
- sin.sin_addr.S_un.S_addr =INADDR_ANY;
- if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) ==SOCKET_ERROR)
- {
- printf("bind error !");
- }
- //开始监听
- if(listen(slisten, 5) ==SOCKET_ERROR)
- {
- printf("listen error !");
- return0;
- }
- //循环接收数据
- SOCKET sClient;
- sockaddr_in remoteAddr;
- int nAddrlen =sizeof(remoteAddr);
- char revData[255];
- while (true)
- {
- printf("等待连接...\n");
- sClient =accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
- if(sClient ==INVALID_SOCKET)
- {
- printf("accept error !");
- continue;
- }
- printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
- //接收数据
- int ret =recv(sClient, revData, 255, 0);
- if(ret >0)
- {
- revData[ret] =0x00;
- printf(revData);
- }
- //发送数据
- const char *sendData ="你好,TCP客户端!\n";
- send(sClient, sendData, strlen(sendData), 0);
- closesocket(sClient);
- }
- closesocket(slisten);
- WSACleanup();
- return0;
- }
客户端代码:client.cpp
- #include<WINSOCK2.H>
- #include<STDIO.H>
- #include<iostream>
- #include<cstring>
- usingnamespace std;
- #pragma comment(lib, "ws2_32.lib")
- int main()
- {
- WORD sockVersion =MAKEWORD(2, 2);
- WSADATA data;
- if(WSAStartup(sockVersion, &data)!=0)
- {
- return0;
- }
- while(true){
- SOCKET sclient =socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if(sclient ==INVALID_SOCKET)
- {
- printf("invalid socket!");
- return0;
- }
- sockaddr_inserAddr;
- serAddr.sin_family =AF_INET;
- serAddr.sin_port =htons(8888);
- serAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");
- if(connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) ==SOCKET_ERROR)
- { //连接失败
- printf("connect error !");
- closesocket(sclient);
- return0;
- }
- stringdata;
- cin>>data;
- const char *sendData;
- sendData =data.c_str(); //string转const char*
- //char *sendData ="你好,TCP服务端,我是客户端\n";
- send(sclient, sendData, strlen(sendData), 0);
- //send()用来将数据由指定的socket传给对方主机
- //int send(int s, const void *msg, int len, unsigned int flags)
- //s为已建立好连接的socket,msg指向数据内容,len则为数据长度,参数flags一般设0
- //成功则返回实际传送出去的字符数,失败返回-1,错误原因存于error
- char recData[255];
- int ret =recv(sclient, recData, 255, 0);
- if(ret>0){
- recData[ret] =0x00;
- printf(recData);
- }
- closesocket(sclient);
- }
- WSACleanup();
- return0;
- }