基于多线程的网络聊天室
上次学习了一下基于多线程的网络聊天室项目,一直都没时间去整理代码,今天终于整理了一下这个项目的代码。
首先大概介绍下基于TCP/IP协议是如何建立起服务器和客户端之间的关系的几个基本步骤:
Server(服务器) Client(客户端)
1、确定协议版本; 1、确定协议版本;
2、创建socket; 2、创建socket;
3、创建服务器协议地址族; 3、获取服务器协议地址族;
4、绑定;
5、监听;
6、接受客户端连接; 4、连接服务器
7、通信; 5、通信
8、断开连接; 6、断开连接
9、清理协议版本信息 7、清理协议版本信息
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <windows.h>
#pragma warning(disable:4996)
int main(void)
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion != 2))
{
printf("确定协议版本失败!\n");
}
printf("确定协议版本成功!\n");
SOCKET serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (SOCKET_ERROR == serverSocket)
{
printf("创建socket失败:%d\n",GetLastError());
WSACleanup();
return -2;
}
printf("创建socket成功!\n");
SOCKADDR_IN addr = {0};
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = inet_addr("192.168.31.102");
addr.sin_port = htons(10086);
int r = bind(serverSocket, (struct sockaddr*)&addr, sizeof addr);
if (-1 == r)
{
printf("绑定失败:%d\n", GetLastError());
closesocket(serverSocket);
WSACleanup();
return -3;
}
printf("绑定成功!\n");
r = listen(serverSocket,10);
if (-1 == r)
{
printf("监听失败:%d\n", GetLastError());
closesocket(serverSocket);
WSACleanup();
return -3;
}
printf("监听成功!\n");
SOCKADDR_IN cAddr = {0};
int len = sizeof cAddr;
SOCKET clientSocket = accept(serverSocket,(sockaddr*)&cAddr,&len);
if (SOCKET_ERROR == clientSocket)
{
printf("客户端连接失败:%d\n", GetLastError());
WSACleanup();
return -4;
}
printf("客户端连接成功!\n");
char buff[1024];
while (1)
{
r = recv(clientSocket, buff, 1023, NULL);
if (r > 0)
{
buff[r] = 0;
printf("%s发来的数据:%s\n",inet_ntoa(cAddr.sin_addr),buff);
}
}
closesocket(serverSocket);
WSACleanup();
return 0;
}
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <windows.h>
#pragma warning(disable:4996)
int fun(void)
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion != 2))
{
printf("确定协议版本失败!\n");
}
printf("确定协议版本成功!\n");
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (SOCKET_ERROR == clientSocket)
{
printf("创建socket失败:%d\n", GetLastError());
WSACleanup();
return -2;
}
printf("创建socket成功!\n");
SOCKADDR_IN addr = { 0 };
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = inet_addr("192.168.31.102");
addr.sin_port = htons(10086);
int r = connect(clientSocket, (sockaddr*)&addr, sizeof addr);
if (-1 == r)
{
printf("连接服务器失败:%d\n",GetLastError());
closesocket(clientSocket);
WSACleanup();
return -1;
}
printf("连接服务器成功!\n");
char buff[1024];
while (1)
{
scanf("%s",buff);
send(clientSocket, buff, strlen(buff), NULL);
}
closesocket(clientSocket);
WSACleanup();
return 0;
}