控制台线程聊天程序
来源:互联网 发布:mikumikudance境头数据 编辑:程序博客网 时间:2024/05/17 01:51
今天突然想写写控制台上的聊天程序,不想使用客户端、服务器模式编写,所以想到了用两个线程来控制。但是只能在自己的本机测试成功。
应该说是离成功还远着了。首先如果实现多机通信,那么我设置的一个接听、一个发送的线程,要怎么样的执行了。那么就设置一个互斥量,让两个进程一个以接受为先进程,另一个以发送为先进程这样他们就能开始通信了。只能一问一答式的进行聊天。这样就有问题了。不能同时实时聊天。还有什么方法能解决这个问题,请高手指点啊。
#include <stdio.h>
#include <Winsock2.h>
//#include <StdAfx.h>
SOCKET sock;
struct SOCKPARAM{
SOCKET m_sock;
};
bool InitSock()
{
sock = socket(AF_INET,SOCK_DGRAM,0);
if(sock == INVALID_SOCKET)
{
printf("Socket Create Failed!/n");
return FALSE;
}
SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un.S_addr = inet_addr("192.168.104.133");
addrSock.sin_family = AF_INET;
addrSock.sin_port = htons(6000);
int retval;
retval = bind(sock,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
if(retval == SOCKET_ERROR)
{
printf("Socket Bind Failed!/n");
return FALSE;
}
return TRUE;
}
DWORD WINAPI RecvProc(
LPVOID lpParameter);
DWORD WINAPI SendProc(
LPVOID lpParameter);
HANDLE Mutex;
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}
if(FALSE == InitSock())
{
return ;
}
SOCKPARAM * lpParam = new SOCKPARAM;
lpParam->m_sock = sock;
HANDLE Thread1 = CreateThread(NULL,0,RecvProc,(LPVOID)lpParam,0,NULL);
HANDLE Thread2 = CreateThread(NULL,0,SendProc,(LPVOID)lpParam,0,NULL);
CloseHandle(Thread1);
CloseHandle(Thread2);
Mutex = CreateMutex(NULL,FALSE,NULL);
if(Mutex)
{
if(ERROR_ALREADY_EXISTS == GetLastError())
{
printf("only instance can run!");
return ;
}
}
//Sleep(10);
//CreateMutex(
while(1);
return;
}
DWORD WINAPI SendProc(
LPVOID lpParameter)
{
SOCKADDR_IN addrSend;
addrSend.sin_addr.S_un.S_addr = inet_addr("192.168.104.137");
addrSend.sin_family = AF_INET;
addrSend.sin_port = htons(6000);
SOCKET sendsock;
sendsock = ((SOCKPARAM *)lpParameter)->m_sock;
char sendBuf[200];
//memset(sendBuf,NULL,sizeof(sendBuf));
//char tempBuf[300];
while(true)
{
//Sleep(1);
WaitForSingleObject(Mutex,INFINITE);
gets(sendBuf);
sendto(sendsock,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSend,sizeof(SOCKADDR));
ReleaseMutex(Mutex);
}
return 0;
}
DWORD WINAPI RecvProc(
LPVOID lpParameter)
{
SOCKADDR_IN addrRecv;
addrRecv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrRecv.sin_family = AF_INET;
addrRecv.sin_port = htons(6000);
SOCKET recvsock = ((SOCKPARAM *)lpParameter)->m_sock;
int len = sizeof(SOCKADDR);
char recvBuf[200];
char tempBuf[300];
while(true)
{
//Sleep(1);
WaitForSingleObject(Mutex,INFINITE);
recvfrom(recvsock,recvBuf,200,0,(SOCKADDR*)&addrRecv,&len);
sprintf(tempBuf,"%s Says: %s",inet_ntoa(addrRecv.sin_addr),recvBuf);
printf("%s/n",tempBuf);
ReleaseMutex(Mutex);
if(!strcmp(recvBuf,"bye"))
{
exit(0);
}
}
return 0;
}
- 控制台线程聊天程序
- 控制台线程聊天程序
- 控制台聊天程序实例
- 控制台TCP聊天程序
- 【转】控制台聊天程序
- Linux 控制台聊天程序
- udp网络聊天控制台程序
- SOCKET控制台双线程聊天程序
- [Java] Socket/ServerSocket 控制台简单聊天程序
- 基于UDP的控制台聊天程序
- socket聊天程序(多线程,控制台)
- java控制台实现QQ聊天程序
- C#简易聊天机器人(控制台程序)
- Python Socket 线程聊天程序
- 简单的控制台聊天程序(C Socket编程)
- VC++ 基于UDP的控制台聊天程序socket通信
- Udp编写一个聊天程序(线程方式)
- TCP、套接字、单线程、控制台程序
- CXImage600 详细使用配置说明教程
- android各版本的sdk区别
- [转贴]linux进程状态浅析
- 控制台线程聊天程序
- Windows编程中的字符表示
- 控制台线程聊天程序
- Real6410 Linux 常见问题总结
- Fedora 10安装Oracle 10g
- 朋友们都要结婚了。。。
- Linux Shell脚本ldd命令原理及使用方法
- GzipStream 相关(操作steam绝对经典)
- 判断应用程序的路径
- 通过js获取TreePanel所有的值
- gdb简单应用(待补充)