多线程控制台TCP聊天工具
来源:互联网 发布:2841财神一码数据分析 编辑:程序博客网 时间:2024/05/21 22:42
服务器程序:
// Server.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define BUF_SZIE 64
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
char buf[BUF_SZIE]; //接收数据缓冲区
int retVal; //返回值
char bufserve[BUF_SZIE]; //接收数据缓冲区
char tempBuf[BUF_SZIE];
struct scoketname{
SOCKET sock;
char* addr;
};
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
SOCKET sock = (SOCKET)lpParameter;
while(1)
{
retVal = recv(sock , buf, BUF_SZIE, 0);
if(buf!=0)
{
printf("客户端说:%s\n", buf);
}
}
return 0;
}
int main(int argc, char* argv[])
{
WSADATA wsd; //WSADATA变量
SOCKET sServer; //服务器套接字
SOCKET sClient; //客户端套接字
SOCKADDR_IN addrServ;; //服务器地址
//初始化套结字动态库
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
//创建套接字
sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == sServer)
{
printf("socket failed!\n");
WSACleanup();//释放套接字资源;
return -1;
}
//服务器套接字地址
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(4999);
addrServ.sin_addr.s_addr = INADDR_ANY;
//绑定套接字
retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
if(SOCKET_ERROR == retVal)
{
printf("bind failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源;
return -1;
}
//开始监听
retVal = listen(sServer, 1);
if(SOCKET_ERROR == retVal)
{
printf("listen failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源;
return -1;
}
//接受客户端请求
sockaddr_in addrClient;
int addrClientlen = sizeof(addrClient);
sClient= accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);
if(INVALID_SOCKET == sClient)
{
printf("accept failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源;
return -1;
}
HANDLE hThread=CreateThread(NULL,0,ThreadProc1,(LPVOID)sClient,0,NULL); //创建接收线程
CloseHandle(hThread);
if(hThread==NULL)
{
printf("CreateThread() failed! :%s",GetLastError());
return 1;
}
while(1)
{
gets(buf);
retVal = send(sClient, buf, strlen(buf), 0);
if (SOCKET_ERROR == retVal)
{
printf("recv failed!\n");
closesocket(sServer); //关闭套接字
closesocket(sClient); //关闭套接字
WSACleanup(); //释放套接字资源;
return -1;
}
}
closesocket(sServer); //关闭套接字
closesocket(sClient); //关闭套接字
WSACleanup(); //释放套接字资源;
return 0;
}
客户端程序:
// Client.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define BUF_SZIE 64
#include "winsock2.h"
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")
char buf[BUF_SZIE]; //接收数据缓冲区
int retVal; //返回值
char bufsend[BUF_SZIE];
char tempBuf[BUF_SZIE];
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
SOCKET sock = (SOCKET)lpParameter;
while(1)
{
gets(bufsend);
int ret = send(sock, bufsend, strlen(bufsend), 0);
if(ret==0)
{
return 1;
}
else if(ret==SOCKET_ERROR)
{
printf("Send() failed! :%s",WSAGetLastError());
return 1;
}
}
return 0;
}
int main(int argc, char* argv[])
{
WSADATA wsd; //WSADATA变量
SOCKET sHost; //服务器套接字
SOCKADDR_IN servAddr; //服务器地址
//初始化套结字动态库
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return -1;
}
//创建套接字
sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == sHost)
{
printf("socket failed!\n");
WSACleanup();//释放套接字资源
return -1;
}
//设置服务器地址
servAddr.sin_family =AF_INET;
servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servAddr.sin_port = htons((short)4999);
int nServAddlen = sizeof(servAddr);
//连接服务器
retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));
if(SOCKET_ERROR == retVal)
{
printf("connect failed!\n");
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
HANDLE hThread=CreateThread(NULL,0,ThreadProc1,(LPVOID)sHost,0,NULL);
CloseHandle(hThread);
if(hThread==NULL){
printf("CreateThread() failed! :%s",GetLastError());
return 1;
}
//向服务器发送数据
ZeroMemory(buf, BUF_SZIE);
while(1)
{
retVal = recv(sHost, buf, BUF_SZIE, 0);
if (SOCKET_ERROR == retVal)
{
printf("send failed!\n");
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
if(buf!=0)
{
sprintf(tempBuf,"%s say : %s",inet_ntoa(servAddr.sin_addr),buf);
printf("%s\n", tempBuf);
}
}
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return 0;
}
- 多线程控制台TCP聊天工具
- tcp 聊天工具客户端
- 基于TCP的QQ聊天工具
- java 简易聊天工具(TCP)
- 基于TCP的多人聊天工具
- 聊天工具
- 聊天工具
- 【Java】基于TCP协议多线程服务器-客户端交互控制台聊天室简例
- 控制台TCP聊天程序
- 22java中使用UDP TCP 协议做聊天工具
- Node教学--02 TCP服务器(小聊天工具)
- JAVA进阶案例 TCP编程之网络聊天工具(服务端)
- JAVA进阶案例 TCP编程之网络聊天工具(客户端)
- TCP多线程
- TCP多线程
- fasm 控制台多线程示例
- java制作QQ聊天工具——2多线程1
- Java Socket编程之用多线程实现多人聊天工具
- ubuntu下怎样防止rm删除后恢复问题
- AdaBoost(四)
- 豆瓣广告系统持续发布相关的实践—豆瓣网_张伟
- android 电池(一):锂电池基本原理篇
- vi操作技巧
- 多线程控制台TCP聊天工具
- Android之Camera预览过程中插拔摄像头节点后移
- EM算法和GMM算法(五)
- iOS 7 Sprite Kit游戏——探险
- 黑马程序员_java基础加强学习之枚举
- mysql 行转列
- s3c2440的中断裸机程序
- STACK 栈函数
- SVM(六)