socket简单案例实现

一、什么是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

  1. #include <stdio.h>
  2. #include <winsock2.h>
  3. #pragma comment(lib,"ws2_32.lib"
  4. int main(int argc, char*argv[]) 
  5. //初始化WSA 
  6. WORD sockVersion =MAKEWORD(2,2); 
  7. WSADATA wsaData; 
  1. if(WSAStartup(sockVersion, &wsaData)!=0
  1. return0
  1. //创建套接字 
  2. SOCKET slisten =socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
  1. if(slisten ==INVALID_SOCKET) 
  1. printf("socket error !"); 
  1. return0
  1. //绑定IP和端口 
  2. sockaddr_insin; 
  3. sin.sin_family =AF_INET; 
  4. sin.sin_port =htons(8888); 
  5. sin.sin_addr.S_un.S_addr =INADDR_ANY;  
  1. if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) ==SOCKET_ERROR
  1. printf("bind error !"); 
  2. //开始监听 
  1. if(listen(slisten, 5) ==SOCKET_ERROR
  1. printf("listen error !"); 
  1. return0
  1. //循环接收数据 
  2. SOCKET sClient; 
  3. sockaddr_in remoteAddr; 
  4. int nAddrlen =sizeof(remoteAddr); 
  5. char revData[255];  
  6. while (true
  7. printf("等待连接...\n"); 
  8. sClient =accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen); 
  1. if(sClient ==INVALID_SOCKET) 
  1. printf("accept error !"); 
  1. continue
  1. printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr)); 
  2. //接收数据 
  3. int ret =recv(sClient, revData, 255, 0);        
  1. if(ret >0
  1. revData[ret] =0x00
  2. printf(revData); 
  3. //发送数据 
  4. const char *sendData ="你好,TCP客户端!\n"
  1. send(sClient, sendData, strlen(sendData), 0); 
  1. closesocket(sClient); 
  2. closesocket(slisten); 
  3. WSACleanup(); 
  1. return0
  1. }

客户端代码:client.cpp

  1. #include<WINSOCK2.H>
  2. #include<STDIO.H>
  3. #include<iostream>
  4. #include<cstring>
  1. usingnamespace std;
  1. #pragma comment(lib, "ws2_32.lib")
  2. int main()
  3. {
  4. WORD sockVersion =MAKEWORD(2, 2);
  5. WSADATA data;
  1. if(WSAStartup(sockVersion, &data)!=0)
  1. {
  1. return0;
  1. }
  2. while(true){
  3. SOCKET sclient =socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  1. if(sclient ==INVALID_SOCKET)
  1. {
  2. printf("invalid socket!");
  1. return0;
  1. }
  2. sockaddr_inserAddr;
  3. serAddr.sin_family =AF_INET;
  4. serAddr.sin_port =htons(8888);
  5. serAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");
  1. if(connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) ==SOCKET_ERROR)
  1. {  //连接失败
  2. printf("connect error !");
  3. closesocket(sclient);
  1. return0;
  1. }
  1. stringdata;
  1. cin>>data;
  2. const char *sendData;
  3. sendData =data.c_str();   //string转const char*
  4. //char *sendData ="你好,TCP服务端,我是客户端\n";
  1. send(sclient, sendData, strlen(sendData), 0);
  1. //send()用来将数据由指定的socket传给对方主机
  2. //int send(int s, const void *msg, int len, unsigned int flags)
  3. //s为已建立好连接的socket,msg指向数据内容,len则为数据长度,参数flags一般设0
  4. //成功则返回实际传送出去的字符数,失败返回-1,错误原因存于error
  5. char recData[255];
  6. int ret =recv(sclient, recData, 255, 0);
  1. if(ret>0){
  1. recData[ret] =0x00;
  2. printf(recData);
  3. }
  4. closesocket(sclient);
  5. }
  6. WSACleanup();
  1. return0;
  1. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值