使用C/C++实现Socket聊天程序
Initsock.h文件
- // initsock.h文件
- #include <winsock2.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <stdio.h>
- #pragma comment(lib, "WS2_32") // 链接到WS2_32.lib
- class CInitSock
- {
- public:
- CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)
- {
- // 初始化WS2_32.dll
- WSADATA wsaData;
- WORD sockVersion = MAKEWORD(minorVer, majorVer);
- if(::WSAStartup(sockVersion, &wsaData) != 0)
- {
- exit(0);
- }
- }
- ~CInitSock()
- {
- ::WSACleanup();
- }
- };
TCP版
TCPClient.cpp文件
- //
- // TCPClient.cpp文件
- /*
- 《使用说明》
- 0.运行程序前请查看是否将initsock.h
- 文件引入到项目中。
- 1.首先修改聊天对方的IP地址
- 2.请首先运行服务端(TCPServer)程序,再运行客户端(TCPClient)程序:
- 如配置正确服务端会收到相关连接信息。
- 3.连接成功后,需要由服务器端首先发起会话(输入消息并确认发送),
- 客户端收到消息后才能输入消息并确认发送到服务器端。
- 并且双方每次只能发送一条消息。如想发送第二条消息,需要等待该方成功
- 接受到另一方的消息后才能继续输入消息。
- */
- #include "InitSock.h"
- #include <stdio.h>
- #include <iostream.h>
- CInitSock initSock; // 初始化Winsock库
- int main()
- {
- // 创建套节字
- SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if(s == INVALID_SOCKET)
- {
- printf(" Failed socket() /n");
- return 0;
- }
- // 也可以在这里调用bind函数绑定一个本地地址
- // 否则系统将会自动安排
- // 填写远程地址信息
- sockaddr_in servAddr;
- servAddr.sin_family = AF_INET;
- servAddr.sin_port = htons(4567);
- // 注意,这里要填写服务器程序(TCPServer程序)所在机器的IP地址
- // 如果你的计算机没有联网,直接使用127.0.0.1即可
- servAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.129");
- if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)
- {
- printf(" Failed connect() /n");
- return 0;
- }
- char buff[256];
- char szText[256] ;
- while(TRUE)
- {
- //从服务器端接收数据
- int nRecv = ::recv(s, buff, 256, 0);
- if(nRecv > 0)
- {
- buff[nRecv] = '/0';
- printf("接收到数据:%s/n", buff);
- }
- // 向服务器端发送数据
- cin>>szText ;
- szText[255] = '/0';
- ::send(s, szText, strlen(szText), 0) ;
- }
- // 关闭套节字
- ::closesocket(s);
- return 0;
- }
TCPServer.cpp文件
- // TCPServer.cpp文件
- /*
- 《使用说明》
- 0.运行程序前请查看是否将initsock.h
- 文件引入到项目中。
- 1.首先修改聊天对方的IP地址
- 2.请首先运行服务端(TCPServer)程序,再运行客户端(TCPClient)程序:
- 如配置正确服务端会收到相关连接信息。
- 3.连接成功后,需要由服务器端首先发起会话(输入消息并确认发送),
- 客户端收到消息后才能输入消息并确认发送到服务器端。
- 并且双方每次只能发送一条消息。如想发送第二条消息,需要等待该方成功
- 接受到另一方的消息后才能继续输入消息。
- */
- #include "InitSock.h"
- #include <stdio.h>
- #include <iostream.h>
- CInitSock initSock; // 初始化Winsock库
- int main()
- {
- // 创建套节字
- SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if(sListen == INVALID_SOCKET)
- {
- printf("Failed socket() /n");
- return 0;
- }
- // 填充sockaddr_in结构
- sockaddr_in sin;
- sin.sin_family = AF_INET;
- sin.sin_port = htons(4567);
- sin.sin_addr.S_un.S_addr = INADDR_ANY;
- // 绑定这个套节字到一个本地地址
- if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
- {
- printf("Failed bind() /n");
- return 0;
- }
- // 进入监听模式
- if(::listen(sListen, 2) == SOCKET_ERROR)
- {
- printf("Failed listen() /n");
- return 0;
- }
- // 循环接受客户的连接请求
- sockaddr_in remoteAddr;
- int nAddrLen = sizeof(remoteAddr);
- SOCKET sClient = 0;
- char szText[] = " TCP Server Demo! /r/n";
- while(sClient==0)
- {
- // 接受一个新连接
- sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
- if(sClient == INVALID_SOCKET)
- {
- printf("Failed accept()");
- }
- printf("接受到一个连接:%s /r/n", inet_ntoa(remoteAddr.sin_addr));
- continue ;
- }
- while(TRUE)
- {
使用C/C++实现Socket聊天程序(代码+实验报告)
最新推荐文章于 2022-10-13 15:11:27 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)