您的位置:首页 > 其它

windows socket聊天程序 VC环境 用线程实现 适用初学者

2011-04-06 18:12 169 查看
//一对一聊天,用线程实现,一个线程负责发送消息,一个线程负责接收消息

//服务器端

#include <winsock2.h>

#include <windows.h>

#include <iostream.h>

#define PORT_SERVER 6666

#define NUM_CLIENTS 10

#pragma comment(lib, "ws2_32.lib")

void SendMsg(LPVOID lpParameter);

void RecvMsg(LPVOID lpParameter);

SOCKET sock_client;

int main(int argc, char *argv[])

{

cout << "Start server..." << endl;

WSADATA wsaData;

WORD sockVersion = MAKEWORD(2, 0);



if(WSAStartup(sockVersion, &wsaData) != 0)

{

cout << "Failed to retrive version." << endl;

return 0;

}



SOCKET sock_sev;

sock_sev = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);

if(sock_sev == INVALID_SOCKET)

{

cout << "Invalid socket." << endl;

WSACleanup();

return 0;

}

sockaddr_in addr_sev;

addr_sev.sin_family = AF_INET;

addr_sev.sin_port = htons(PORT_SERVER);

addr_sev.sin_addr.s_addr = INADDR_ANY;



if (SOCKET_ERROR == bind(sock_sev, (sockaddr *)&addr_sev, sizeof(addr_sev)))

{

cout << "Failed to bind." << endl;

WSACleanup();

return 0;

}

if(SOCKET_ERROR == listen(sock_sev, NUM_CLIENTS))

{

cout << "Failed to listen." << endl;

WSACleanup();

return 0;

}



//SOCKET sock_client;

sockaddr_in addr_client;

int nAddrLen = sizeof(addr_client);

sock_client = accept(sock_sev, (sockaddr *)&addr_client, &nAddrLen);



if (INVALID_SOCKET == sock_client)

{

cout << "Failed to accept." << endl;



}

HANDLE hThread1, hThread2;

hThread2=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvMsg, NULL, 0, NULL);

hThread1=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendMsg, NULL, 0, NULL);





CloseHandle(SendMsg);

CloseHandle(RecvMsg);



Sleep(200000); //主线程沉睡200秒

//cout << "Connection from " << inet_ntoa(addr_client.sin_addr) << endl;

closesocket(sock_client);

return 1;

}

void SendMsg(LPVOID lpParameter)

{

//cout << "进入发送消息线程" << endl;

char tmp[50];



while(1)

{

cin >> tmp;

send(sock_client, tmp, strlen(tmp), 0);

}

}

void RecvMsg(LPVOID lpParameter)

{

//cout << "进入接收消息线程" << endl;

char buf[50];

int recv_size;

while (1)

{

recv_size = recv(sock_client, buf, 512, 0);



if (512 > recv_size && 0 < recv_size)

{

buf[recv_size] = '/0';



if(strcmp(buf, "quit") == 0)

{

//ExitThread(NULL);退出该线程

cout << "客户端退出" << endl;

}else

{

cout << "receive data is :" << buf << endl;

}

memset(buf, 0, sizeof(buf));

}



}

}



//客户端



#include <winsock2.h>

#include <windows.h>

#include <iostream.h>

#define PORT_SERVER 6666

#pragma comment(lib,"ws2_32.lib")

SOCKET sock_client;

void SendMsg(LPVOID lpParameter);

void RecvMsg(LPVOID lpParameter);

int main(int argc, char* argv[])

{

cout << "Start up tcp client." << endl;



WSADATA wsaData;

WORD sockVersion = MAKEWORD(2, 0);

if (0 != WSAStartup(sockVersion, &wsaData))

{

cout << "Failed to retrive socket version."

<< endl;

return 0;

}





sock_client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (INVALID_SOCKET == sock_client)

{

cout << "Invalid socket." << endl;

WSACleanup();

return 0;

}

sockaddr_in addr_sev;



addr_sev.sin_family = AF_INET;

addr_sev.sin_port = htons(PORT_SERVER);

addr_sev.sin_addr.s_addr = inet_addr("127.0.0.1");



if (SOCKET_ERROR == connect(sock_client, (sockaddr *)&addr_sev, sizeof(addr_sev)))

{

cout << "Failed to connect." << endl;

WSACleanup();

return 0;

}



cout << "连接成功" << endl;



HANDLE hThread1, hThread2;

hThread1=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SendMsg, NULL, 0, NULL);

hThread2=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvMsg, NULL, 0, NULL);



CloseHandle(SendMsg);

CloseHandle(RecvMsg);



Sleep(200000); //主线程沉睡200秒



closesocket(sock_client);

WSACleanup();

//system("PAUSE");

return 0;

}

void SendMsg(LPVOID lpParameter)

{

//cout << "进入发送消息线程" << endl;

char tmp[50];



while(1)

{

cin >> tmp;

send(sock_client, tmp, strlen(tmp), 0);



if(strcmp(tmp, "quit") == 0)

{

cout << "退出" << endl;

ExitProcess(NULL);

}

}

}

void RecvMsg(LPVOID lpParameter)

{

//cout << "进入接收消息线程" << endl;



char buf[50];

int recv_size;



while (1)

{

recv_size = recv(sock_client, buf, 512, 0);



if (512 > recv_size && 0 < recv_size)

{

buf[recv_size] = '/0';

cout << "receive data is :" << buf << endl;

memset(buf, 0, sizeof(buf));

}



}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: