求一个客户端和服务器端可以相互通信的代码。。。

Cquice 2012-06-12 03:41:15
没有什么要求,就是客户端可以向服务器端发送接收数据
服务器端可以向客户端发送接收数据。
本人初次接触Socket编程,求各位大神指教
...全文
111 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
闭着眼刷牙 2012-06-12
  • 打赏
  • 举报
回复
我来混分的 也给你发一份自己的
Cquice 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
这个问题,本身没有一个确定的回答,如何双方发送消息取决你的协议设计,

方法有很多,不外乎是,多线程:一个线程接收数据,一个线程发送数据

WIN32的完成端口结构,注册事件
[/Quote]
//Server.cpp
#include <iostream>
#include <Windows.h>

using namespace std;

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

#define PORT 4000
#define IP_ADDRESS "127.0.0.1"

DWORD WINAPI ClientThread(LPVOID lpParameter)
{
SOCKET CientSocket = (SOCKET)lpParameter;
int Ret = 0;
char RecvBuffer[MAX_PATH];

while ( true )
{
memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);
if ( Ret == 0 || Ret == SOCKET_ERROR )
{
cout<<"客户端退出!"<<endl;
break;
}
cout<<"接收到客户信息为:"<<RecvBuffer<<endl;
}

return 0;
}

int main(int argc, char* argv[])
{
WSADATA Ws;
SOCKET ServerSocket, CientSocket;
struct sockaddr_in LocalAddr, ClientAddr;
int Ret = 0;
int AddrLen = 0;
HANDLE hThread = NULL;

//Init Windows Socket
if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )//打开winsock
{
cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
return -1;
}

//Create Socket
ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//建立套接字
if ( ServerSocket == INVALID_SOCKET )
{
cout<<"Create Socket Failed::"<<GetLastError()<<endl;
return -1;
}
//初始化LocalAddr
LocalAddr.sin_family = AF_INET;
LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
// LocalAddr.sin_addr.s_addr = INADDR_ANY;
// INADDR_ANY 表示下面的函数bind函数把刚才创建的socket绑定到当前的电脑的IP地址上。
LocalAddr.sin_port = htons(PORT);//主机序转化为网络序
memset(LocalAddr.sin_zero, 0x00, 8);

//Bind Socket 服务器绑定端口
Ret = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr));
if ( Ret != 0 )
{
cout<<"Bind Socket Failed::"<<GetLastError()<<endl;
return -1;
}

Ret = listen(ServerSocket, 10);
if ( Ret != 0 )
{
cout<<"listen Socket Failed::"<<GetLastError()<<endl;
return -1;
}

cout<<"服务端已经启动"<<endl;

while ( true )
{
AddrLen = sizeof(ClientAddr);
CientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);
if ( CientSocket == INVALID_SOCKET )
{
cout<<"Accept Failed::"<<GetLastError()<<endl;
break;
}

cout<<"客户端连接::"<<inet_ntoa(ClientAddr.sin_addr)<<" 端口号:"<<ClientAddr.sin_port<<endl;

hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CientSocket, 0, NULL);
if ( hThread == NULL )
{
cout<<"Create Thread Failed!"<<endl;
break;
}

CloseHandle(hThread);
}

closesocket(ServerSocket);
closesocket(CientSocket);
WSACleanup();

return 0;
}
例如这个用tcp协议的程序 怎么把他改成双线程 一个线程监听接收 一个线程去发送信息呢?
Cquice 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
留个邮箱 ,我给你发一份。
[/Quote]
383863692@qq.com
谢谢了
Cquice 2012-06-12
  • 打赏
  • 举报
回复
明白了!谢谢了!
hyqok 2012-06-12
  • 打赏
  • 举报
回复
留个邮箱 ,我给你发一份。
toufazhile 2012-06-12
  • 打赏
  • 举报
回复
这个问题,本身没有一个确定的回答,如何双方发送消息取决你的协议设计,

方法有很多,不外乎是,多线程:一个线程接收数据,一个线程发送数据

WIN32的完成端口结构,注册事件
Cquice 2012-06-12
  • 打赏
  • 举报
回复
//server.cpp
while ( true )
{
memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);
if ( Ret == 0 || Ret == SOCKET_ERROR )
{
cout<<"客户端退出!"<<endl;
break;
}
cout<<"接收到客户信息为:"<<RecvBuffer<<endl;
}

//client.cpp
while ( true )
{
cin.getline(SendBuffer, sizeof(SendBuffer));
Ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
if ( Ret == SOCKET_ERROR )
{
cout<<"Send Info Error::"<<GetLastError()<<endl;
break;
}
}
上面的代码只能是客户端发送信息 接收端接收信息.怎么在上面完善一些,使得双方可以互相发送信息
toufazhile 2012-06-12
  • 打赏
  • 举报
回复
使用socket通信就可以实现啦,只是不知道你要什么东西,大概是服务端 :

WIN32:

SOCKET s = socket();
bind(s)
listen(s)
SOCKET ss = accept(s);

recv(ss);
send(ss);

客户端:

WIN32:

SOCKET s = socket(s);

connect(s);

send(s);

recv(s);

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧